【问题标题】:"Implicit instantiation of undefined template" when forward declaring template class转发声明模板类时“未定义模板的隐式实例化”
【发布时间】:2012-09-29 14:36:08
【问题描述】:

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

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

【问题讨论】:

    标签: c++ templates clang forward-declaration


    【解决方案1】:

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

    另外我认为模板类的前向定义支持不是很广泛

    【讨论】:

      【解决方案2】:

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

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

      不幸的是(但并非出乎意料)这会将错误移至下一行。初始化那个指针的问题依然存在:一旦你尝试调用new MyTemplateClass&lt;false&gt;,你会看到一个错误。

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

      【讨论】:

        【解决方案3】:

        你忘了#include什么吗?

        我忘记了之后得到了这个

        #include <array>
        

        当使用std::array

        :^)

        【讨论】:

        • 对我来说是 #include 我正在努力从 gcc 迁移到 clang。
        • 是的,编译器之间在string 和其他库的默认包含和嵌套包含方面存在一些差异。
        • 对我来说,它是#include (像我这样的初学者注意)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-05
        • 2021-12-18
        • 1970-01-01
        相关资源
        最近更新 更多