这里有一个最小的例子来说明我遇到的问题。
#include <iostream>
struct A {
template <int i>
void dosomething();
void show();
};
template<>
void A::dosomething<0>()
{
std::cout << "0 in A" << std::endl;
}
void A::show()
{
dosomething<0>();
}
struct B : A {
// Without the following declaration:
// error: template-id ‘dosomething<1>’ for ‘void B::dosomething()’
// does not match any template declaration
template <int i>
void dosomething();
};
template<>
void B::dosomething<1>()
{
std::cout << "1 in B" << std::endl;
}
int main()
{
A x;
x.dosomething<0>();
B y;
y.dosomething<0>(); // Link error!
y.show();
y.dosomething<1>();
return 0;
}
模板成员A::doSomething()
显式专用于基类中的i=0
。模板的代码是显式生成的,并在成员A::show()
中调用。
我发现的第一个问题是:
template <int i>
void dosomething();
template-id ‘dosomething<1>’ for ‘void B::dosomething()’
does not match any template declaration.
undefined reference to `void B::dosomething<0>()'
该错误是由于在main中调用y.doSomething<0>()
造成的。可以通过调用Y.A::DoSomething<0>()
来避免这种情况。为什么doSomething<0>()
在b
的实例中显然是不可见的?
当对成员函数进行脱节
定义时,将在::
运算符之前引用的类中查找该函数的声明。
考虑一下:
struct C { void test(); };
struct D : C { };
void D::test() { }; // error, test is not a member of D but of C
这和做
template<> void B::dosomething<1>()
{ }
我有一个模板函数doSomething(T),它接受任何类型的参数…类型基类除外。 所以我把doSomething模板专门用于类型Base的参数,所以它做了一些不同的事情。 然而,当我将派生类传递给doSomething时,它会打印“所有类型!”,而我希望它打印“Base!”,因为派生类本质上也是一个基类。 如果我有: 然后doSomething(d)也会打印“所有类型!”而不是“base!”,因
还尝试在专门化的中进行模板方法专门化: 这一次它编译,但调用原始方法,即 解决方案
我有以下模板方法: 但是我得到了那些奇怪的链接错误: /usr/lib/gcc/x86_64-redhat-linux/4.4。7/../../../../包括/c/4.4。7/例外:62:void MyStruct::readField(std::basic_istream)的多重定义 如何专门化此成员函数? 编辑 这种方法在以下方面起作用: 或者使用s或在类外使用
关于下一个代码,我有一些问题: > 类专业化
我有一个通用算法,需要访问其模板类型的特征。有一个特征类可以专门用于提供这些特征。 在我的类中使用此算法时,我想将其与类中定义的私有类型一起使用。 然而,专门化只能发生在或全局范围内,而我的类是不可访问的。 是否有可能以某种方式专门化具有私有类型的模板,至少在可访问此类型的范围内? 也许可以将这个专门化声明为一个类?