具有前向类声明的模板

时间:2015-03-02 05:31:20

标签: c++ templates incomplete-type

我有一个声明模板功能的库:

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

类库未在此库中定义,但由于它只是一个模板,因此此时不应实例化;因此,通过显式使用class关键字,可以成功编译库。

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

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

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

TIA

1 个答案:

答案 0 :(得分: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>();
}