【问题标题】:template with forward class declaration带有前向类声明的模板
【发布时间】:2015-03-02 05:31:20
【问题描述】:

我有一个声明模板函数的库:

template <typename T>
void Foo(blah...)
{
   class Bar mybar;
   ...
}

类 Bar 没有在这个库中定义,但是因为它只是一个模板,所以此时不​​应该实例化它;因此,通过显式使用 class 关键字,成功编译了库。

稍后在我确实需要实例化此模板的主程序文件中,我将文件包含在类 Bar 的完整定义中。它曾经与 gcc 4.4.2 一起工作,但现在升级到 4.8.1 我收到错误:

"Foo(blah...) [with T = blahblah]::Bar mybar has incomplete type"

编译器似乎将 Bar 视为模板函数中的临时类声明,而不是转发类。我想知道是否有什么可以解决这个问题,或者这个技巧无论如何都不应该起作用?这样做的重点是,类 Bar 有很多依赖项,并且大多数使用我的库的程序不需要类 Bar,因此没有必要链接类 Bar 所依赖的所有额外库。

TIA

【问题讨论】:

    标签: c++ templates incomplete-type


    【解决方案1】:

    线

    class Bar mybar;
    

    声明Bar为函数模板的嵌套类并定义 mybar 作为嵌套类 Bar 类型的成员变量。它没有将mybar 声明为可能存在于函数模板之外的类Bar 的实例。

    如果您希望mybar 成为在函数模板之外定义的Bar 的实例,您需要使用:

    class Bar;
    
    template <typename T>
    void Foo(blah...)
    {
       Bar mybar;
       ...
    }
    

    更新

    下面的程序可以用g++ -Wall -std=c++11编译和构建

    class Bar;
    
    template <typename T>
    void Foo()
    {
       Bar mybar;
    }
    
    class Bar
    {
       public:
          Bar() {}
    };
    
    int main()
    {
       Foo<int>();
       Foo<double>();
    }
    

    【讨论】:

    • 已经试过了。它甚至不会让我编译库:“不完整类型'class Bar'的无效使用”
    • 我很确定这行得通,但我的问题是我需要在没有定义类 Bar 的情况下编译 lib(即,只有示例的上半部分),稍后会定义但在实例化之前。但是非常感谢您的时间!我想我最好放弃这个并想出一个新的解决方案。 :-)
    • @Shine,你在说哪个库?代码的上半部分在语法上是正确的。只有在实例化函数模板时才需要Bar。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多