49

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

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

4

3 回答 3

135

你忘了#include什么吗?

我忘记了之后得到了这个

#include <array>

当使用一个std::array

:^)

于 2017-03-16T22:33:56.933 回答
35

为了声明任何类型的变量,无论模板与否,该类型的整个定义都必须可用。您不能前向声明一个模板,然后像定义它一样开始使用它。此时您所能做的就是声明一个指向基于模板的类型的对象的指针,如下所示:

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

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

您需要重新安排代码以将模板的定义移到其使用位置之前。这可能有点乏味,但没有办法绕过它:编译器需要在您开始实例化模板并调用其方法的那一刻拥有整个定义。

于 2012-10-09T09:50:16.973 回答
1

据我了解,您不能转发声明某些内容,然后在您的堆栈中实例化它(模板与否)。

另外我认为模板类的前向定义没有非常广泛的支持

于 2012-10-09T09:48:51.953 回答