Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 外部模板不适用于gcc?_C++_Templates_Gcc_C++11_Extern - Fatal编程技术网

C++ 外部模板不适用于gcc?

C++ 外部模板不适用于gcc?,c++,templates,gcc,c++11,extern,C++,Templates,Gcc,C++11,Extern,C++11引入了一个名为“extern template”的特性,它表示模板实例存在于其他翻译单元中。(我说的对吗?) 这堂课还告诉我们,如果您指定了extern模板而不包含实例化,链接器将产生错误。(视频中大约2:25) 因此,我尝试构建下一个代码: #include <iostream> template<class T> struct Foo { static constexpr int type_size = sizeof(T); }; extern

C++11引入了一个名为“extern template”的特性,它表示模板实例存在于其他翻译单元中。(我说的对吗?)

这堂课还告诉我们,如果您指定了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;
}
#包括
模板
结构Foo
{
静态constexpr int type_size=sizeof(T);
};
外部模板结构Foo;
int main()
{
标准::cout
如果指定extern模板并且不包含实例化,链接器将产生错误


不,不一定。只有在实际使用模板时才会出现问题。您使用的是定义为该模板静态成员的编译时常量,但该常量在编译时会被该常量的值替换。替换之后,该模板不再有任何用途,因此不需要定义该模板e、

理解问题时遇到困难…问题出在哪里?请尝试添加(非内联!)函数到<代码> Foo< /Cord>,然后看看会发生什么。我觉得GCC家伙是第一个做代码>外部模板< /> >的,在新的C++标准被放在一起之前,它可以在旧版本的G++中使用。所以它可能不是编译器在这里出错。@ StATICX问题解决了。谢谢大家的关注。st完整性:当你问一个形式为“功能X在编译器Y上不起作用”的问题时,你应该提到你正在使用的编译器的哪个版本。在这种情况下,这不是问题所在,但在许多情况下,答案是“功能X被添加到编译器Y版本NNNNNN中”在main中添加
Foo-Foo;
仍然可以编译。@PeterSchneider说得对,但这也不会使用在编译时无法直接使用的模板的任何部分。(特别是,它不会调用任何构造函数或析构函数,因为
Foo
的构造函数和析构函数都是微不足道的。)
#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;
}