2012-10-09 135 views
15

我有一些代码需要前向声明一个模板类(或者至少,前向声明会使事情对我来说变得更容易。 ..)。我已经写了我有这么一个问题的简化版本,我可以在这里显示出来:正向声明模板类时的“未定义模板的隐式实例化”

template<bool> 
class MyTemplateClass; 

int main(int argc, char* argv[]) 
{ 
    MyTemplateClass<false> myTemp; // error here 
    myTemp.GetTheValue(); 
    return 0; 
} 

template<bool bShouldMult> 
class MyTemplateClass 
{ 
    int m_myint; 
    float m_myfloat; 

public: 
    MyTemplateClass() : m_myint(5), m_myfloat(3.0f) {} 
    float GetTheValue() 
    { 
     return m_myint * (bShouldMult ? m_myfloat : 1.0f); 
    } 

}; 

我在注释行得到的错误是:

Error - implicit instantiation of undefined template 'MyTemplateClass<false>' 

什么其他细节我需要包含在MyTemplateClass的前向声明中吗?由于错误不是来自下一行,我假设它不是由于该方法未定义的事实。我使用的编译器是LLVM/CLang,我正在Mac上进行编译。

回答

13

向前定义非常广泛的支持,以声明任何类型,模板或不是一个变量,该类型的定义整个必须是可用的。您不能转发声明模板,然后开始使用它,就好像它已经定义一样。所有你能在这一点上做的是声明的指针,基于模板,这样的类型的对象:

MyTemplateClass<false> *myTempPtr; // No error here 

不幸的是(但不意外),此招式错误到下一行。初始化该指针的问题仍然存在:一旦您尝试调用new MyTemplateClass<false>,您将看到一个错误。

您需要重新安排代码以将模板的定义提前使用。这可能有点乏味,但是没有办法解决它:编译器需要在开始实例化模板并调用其方法的位置具有完整的定义。

0

从我的理解,你不能转发声明的东西,然后实例化它在你的堆栈(模板或不)。

此外,我不认为有模板类

19

你忘了#include的东西吗?

我得到这个忘记

#include <array> 

后,当使用std::array