拥有这个基本层次结构:
// header
class Base
{
virtual void method() { }
virtual ~method() { }
};
class Subclass : Base
{
virtual void method() { }
virtual ~method() { }
};
我希望使用两个显式变体对Base进行子类化(如果可能的话,不必提供两个Subclass实现),因此建议使用显式模板实例化:
// header
class Base
{
virtual void method() { }
virtual ~method() { }
};
class Base1 : public Base { };
class Base2 : public Base { };
template <typename T>
class Subclass : public T
{
virtual void method();
virtual ~method() { }
};
// cpp
template <typename T>
void Subclass<T>::method()
{
}
template class Subclass<Base1>;
template class Subclass<Base2>;
我收到了这个错误:
'方法'没有参数 这取决于模板参数, 所以必须声明'方法' 可用
这是正确的做法吗?我显然需要模板Base才能编译它,但有什么用?
答案 0 :(得分:2)
您应该将模板类和函数的定义放在头文件中(使用者必须可以看到它)。
只能声明完整的专业化(并且在代码无法见到的地方定义)。
此外,如果你想要从类中定义类模板的功能(就像你一样),你必须将它声明为模板:
template< typename T >
void Class<T>::method( )
{
}
无论如何,如果我没记错的话,当您使用由您继承的typename提供的函数method
时,会给出您引用的错误(我认为您还没有发布那段代码,生成错误...):只有在模板实际实例化时才能找到它,因此你需要明确地说它取决于模板参数。
以这种方式致电method
:
T::method();
答案 1 :(得分:0)
问题和解决方案的简要总结:
要使用模板化基类中的方法,需要使用模板参数:
T::method();
或仅使用“this”允许在不明确知道模板参数的情况下找到它:
this->method();
感谢那些指向我找到这个解决方案的人,我没有意识到这一点。还希望指出将模板放在cpp文件中没有问题。