多态显式模板实例化

时间:2010-11-17 16:11:23

标签: c++ templates inheritance instantiation

拥有这个基本层次结构:

// 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才能编译它,但有什么用?

2 个答案:

答案 0 :(得分:2)

您应该将模板类和函数的定义放在头文件中(使用者必须可以看到它)。

只能声明完整的专业化(并且在代码无法见到的地方定义)。

此外,如果你想要从类中定义类模板的功能(就像你一样),你必须将它声明为模板:

template< typename T > 
void Class<T>::method( )
{
}

无论如何,如果我没记错的话,当您使用由您继承的typename提供的函数method时,会给出您引用的错误(我认为您还没有发布那段代码,生成错误...):只有在模板实际实例化时才能找到它,因此你需要明确地说它取决于模板参数。

以这种方式致电method

T::method();

答案 1 :(得分:0)

问题和解决方案的简要总结:

要使用模板化基类中的方法,需要使用模板参数:

T::method();

或仅使用“this”允许在不明确知道模板参数的情况下找到它:

this->method();

感谢那些指向我找到这个解决方案的人,我没有意识到这一点。还希望指出将模板放在cpp文件中没有问题。