使用不完整类型的函数模板实例化

时间:2016-02-09 22:57:25

标签: c++ templates language-lawyer incomplete-type

以下(in)正确的c ++代码是什么?

class MyC;
class MyB {
public:
     template <class MyT> static void Gimme() { MyT(); }
     MyB() { Gimme<MyC>(); }
} B_;

class MyC  {
public: MyC() { }
};

g ++ 4.7.2不抱怨。

2 个答案:

答案 0 :(得分:4)

我猜这个C ++ 14标准的下一部分在这里工作

  

14.6.4.1实例化点

     

8 功能模板,成员函数模板或类的成员函数或静态数据成员的特化   模板可能在a中有多个实例化点   翻译单元,以及实例化的要点   如上所述,对于任何具有这一点的专业化   翻译单元内的实例化,翻译结束   单位也被视为实例化点。 [...]

(强调我的。)

请注意,与C ++ 11相比,C ++ 14中的这部分文档发生了显着变化。另请参阅DR#993,这似乎意味着简单地将此类实例化推迟到翻译单元的末尾是一种有效的实现技术。

我会谨慎地声明你的代码在C ++ 11实例化规则下是不正确的,即使GCC在-std=c++11模式下接受它。

答案 1 :(得分:-1)

是的,这是合法的C ++代码。您将DBSize --------- NULL 声明为前向声明,稍后定义在同一范围内。并且因为C ++编译器使用至少2次传递来解析源文件,所以这是正确的并且将生成正确的机器代码。你的&#34;不完整&#34;类型MyC并不完整。