如果在需要完整类型的上下文中内部使用,则必须将用作模板参数的类型完整吗?

时间:2011-10-26 00:07:26

标签: c++ templates

  

可能重复:
  Incomplete class usage in template

我有一个问题困扰了我几个小时。

最初我认为类型必须在实例化点完成,但是我尝试过的所有编译器都接受该类型在那时仍然是不完整的,只要它被定义翻译单位的任何地方。

为了说明问题,问题在于这个简单程序的正确性:

template <typename T>
int size() {
   return sizeof(T);   // T is required to be complete in this expression
}
class test;            // test is declared, but incomplete

int main() {
   size<test>();
}
// [1] point of instantiation of size<test>()

class test {};         // Definition of test, now it is complete

根据§14.6.4.1/ 1,size<test>的实例化点是标记为[1]的行,此时类型test仍然不完整。如果我们试图在那里执行sizeof(test)操作,编译器就会告诉我们类型不完整。然而,调用一个模板,其中执行相同精确操作的类型在g ++,clang ++,comeau和Visual Studio 2010中编译。

以前的代码是否真的正确?标准中的哪个部分支持将用作模板参数的类型视为完成,如果它在同一个翻译单元中的任何地方完成?或者当必须完成时?

1 个答案:

答案 0 :(得分:1)

模板在结束扩展之后才会被编译(测试在那时完成)。