我有一个声明模板功能的库:
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
答案 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>();
}