鉴于
#include <vector>
// Case I: error
错误C2961:'std :: vector&gt;':不一致 显式实例化,先前的显式实例化没有 指定'extern模板'
template class std::vector<int>;
extern template class std::vector<int>;
// Case II: fine
//extern template class std::vector<int>;
//template class std::vector<int>;
// Case III: fine
//extern template class std::vector<int>;
//template class std::vector<int>;
//template class std::vector<int>;
// Case IV: fine
//extern template class std::vector<int>;
//extern template class std::vector<int>;
//template class std::vector<int>;
//template class std::vector<int>;
int main()
{
}
我使用VS2015版本4.6构建代码并查看C2961错误。但是,我没有看到编译器http://gcc.godbolt.org/的错误。
这是VS2015的错误吗?
答案 0 :(得分:6)
MSVC和Clang在这种情况下发出错误是正确的。标准中的[temp.explicit] / 11表示:
如果实体是两个显式实例化的主题 声明和明确的实例化定义 翻译单位,定义应遵循声明。 [...]
template class std::vector<int>;
是一个显式的实例化定义。具有extern
的那个是显式实例化声明。
请注意,根据[namespace.std] / 2,显式实例化std::vector<int>
在任何情况下都是格式错误的:
[...]程序可以显式实例化中定义的模板 标准库仅当声明取决于a的名称时 用户定义的类型和实例化符合标准库 原始模板的要求。
另请注意,根据[temp.spec] / 5:
,案例III和IV也是不正确的对于给定的模板和一组给定的模板参数,
- 显式实例化定义在程序中最多只出现一次,
[...]
诊断违反此规定不需要实施 规则。