extern模板'不一致的显式实例化'

时间:2017-01-28 22:33:27

标签: c++ c++11 c++14

鉴于

#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的错误吗?

1 个答案:

答案 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也是不正确的
  

对于给定的模板和一组给定的模板参数

     
      
  • 显式实例化定义在程序中最多只出现一次,
  •   
     

[...]

     

诊断违反此规定不需要实施   规则。

相关问题