前向声明模板类时“未定义模板的隐式实例化”

时间:2012-10-09 09:37:41

标签: c++ templates clang forward-declaration

我有一些代码,我需要向前声明一个模板类(或者至少,前向声明会让事情变得更容易......)。我已经写了一个我正在解决的问题的简化版本,所以我可以在这里显示它:

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上编译。

3 个答案:

答案 0 :(得分:57)

你忘记了#include某事吗?

我忘了

后得到了这个
#include <array>

使用std::array

:^)

答案 1 :(得分:22)

为了声明任何类型,模板的变量,该类型的整个定义必须是可用的。您无法转发声明模板,然后开始使用它,就好像它已定义一样。你所能做的就是根据模板声明一个指向类型对象的指针,如下所示:

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

不幸的是(但并非出人意料)这会将错误移至下一行。初始化该指针的问题仍然存在:一旦您尝试调用new MyTemplateClass<false>,您将看到错误。

您需要重新安排代码,以便将模板的定义移到其使用位置之前。这可能有点单调乏味,但没有办法解决它:编译器需要在开始实例化模板并调用其方法的时候获得整个定义。

答案 2 :(得分:0)

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

此外,我认为对模板类的前向定义有非常广泛的支持