C++ VS 2012中的显式模板声明/定义

C++ VS 2012中的显式模板声明/定义,c++,templates,visual-studio-2012,c++11,C++,Templates,Visual Studio 2012,C++11,以下代码声明模板,声明显式实例化定义,然后声明显式实例化声明: template <typename T> T Double(T number) { return number * 2; } extern template int Double<int>(int); // declaration template int Double<int>(int t); // definition int main(int argc, char

以下代码声明模板,声明显式实例化定义,然后声明显式实例化声明:

template <typename T>
T Double(T number)
{
    return number * 2;
}

extern template int Double<int>(int);  // declaration
template int Double<int>(int t);       // definition

int main(int argc, char* argv[])
{
    int n = Double(10);

    return 0;
}
模板
T双精度(T编号)
{
返回号码*2;
}
外部模板int-Double(int);//宣言
模板int-Double(int-t);//定义
int main(int argc,char*argv[])
{
int n=双(10);
返回0;
}
给出一个错误:

error C2929: 'int Double<int>(int)' : explicit instantiation; cannot explicitly force and suppress instantiation of template-class member
错误C2929:'intdouble(int)':显式实例化;无法显式强制和禁止实例化模板类成员
在Visual Studio 2012中

我的印象是,这应该是有效的,因为定义遵循声明


我遗漏了什么吗?

您的程序结构良好。C++11标准第14.7.2/11段规定:

如果实体是显式实例化声明和显式实例化定义的主题 在同一翻译单位中,定义应遵循声明。[……]


您的程序尊重此约束,不会违反任何其他规则。因此,这符合VC11中的缺陷。

此问题似乎已报告给:

微软于2010年3月12日下午1:52发布

你好,

正如您所注意到的,我们的extern模板的实现并不 符合C++-0x标准。我们还有旧的分机 实施虽然我们没有资源来实施 此功能的C++-0x版本,用于下一版本的Visual Studio, 合规性问题是我们的优先事项;我们目前确实打算这样做 在未来版本的Visual Studio中实现此功能

感谢您抽出时间报告此问题。我们非常感谢

<> Jamie Eckman Visual C++团队


这是2010,所以“下一版本”是指VS2012。< /P> < P> VisualStudio 2013中讨论了VisualC++的一致性错误,这是可用的。此修复程序可以在头文件中放置

extern-template
声明,以抑制模板实例化,并且仍然在一个模块中声明显式实例化,这可以减少编译时间和代码膨胀。反转语句(即,显式实例化请求,然后是具有相同模板参数的
外部模板
声明)仍然会导致错误C2929,因为看起来您现在正试图抑制已显式实例化的内容。

仍然在VC++2015中发生。