extern模板不适用于gcc?

时间:2014-05-13 13:55:03

标签: c++ templates gcc c++11 extern

C ++ 11引入了一个名为'extern template'的功能,它表明模板实例存在于其他翻译单元中。(我是对的吗?)

这个(http://www.youtube.com/watch?v=3annCCTx35o)讲座还告诉你,如果指定extern模板并且不包含实例化,链接器将产生错误。(视频中大约2:25)

所以,我试图构建下一个代码:

#include <iostream>

template<class T>
struct Foo
{
    static constexpr int type_size = sizeof(T);
};

extern template struct Foo<int>;

int main()
{
   std::cout<< Foo<int>::type_size << std::endl;
   return 0;
}

我预计构建将失败,因为此文件不包含显式实例化也不包含特化,但是gcc只是构建它,结果运行良好。

我错过了什么?或者,我是否误解了什么?或者,gcc不支持extern模板吗?

更新

我尝试过一个非内联函数的类,extern模板按预期工作!

#include <iostream>

template<class T>
struct Foo
{
    static void print(T t);
};

template<class T>
void Foo<T>::print(T t) { std::cout << t << std::endl; }

extern template struct Foo<int>;

// template struct Foo<int>;

int main()
{
   Foo<int>::print(1);
   return 0;
}

如果没有注释行,则不会构建上面的源代码。 谢谢大家!

1 个答案:

答案 0 :(得分:3)

  

如果指定extern模板并且不包含实例化,则链接器将产生错误。

不,不一定。如果您实际使用模板,则只会出现问题。您正在使用定义为该模板的静态成员的编译时常量,但在编译时它将被常量的值替换。在替换之后,不再使用模板,因此不需要模板的定义。