【发布时间】:2013-12-09 18:35:32
【问题描述】:
我正在寻找关于 GCC 与 MSVC 的不同之处的概述或描述,用于编译 + 链接具有专业化的模板类。例如,这种类型的东西适用于 GCC,但不适用于 MSVC:
// Base.h
template <typename T> struct Base {
template <class G> QString makeTitle(const G* obj){obj->CompilerError();}
};
// in Foo.cpp
template <> template <class G> QString Base<T_1>::makeTitle(const G* obj) { return mystr(); }
void SomeFunc() {
std::cout<< Base<T_1>().makeTitle<myclass>() ;
}
并且解决方案往往是我必须在使用它之前在 Base.h 中声明特化,否则在 Windows 上会出现链接错误。 MSVC 如何/为什么以不同的方式隐式实例化,以及 GCC 如何/为什么对某些 cpp 文件中声明的专业化具有鲁棒性?
注意一般“使用前声明”要求的相关问题:Template specialization - different behaviour between MSVC and GCC/MinGW
【问题讨论】: