C++ 主函数中的显式模板实例化

C++ 主函数中的显式模板实例化,c++,templates,C++,Templates,我有一些玩具代码如下: #include <iostream> using namespace std; template<typename T> class MyClass{ T t; }; template class MyClass<int>; int main() { //template class MyClass<int>; return 0; } #包括 使用名称空间std; 模板 类MyClass{ T;

我有一些玩具代码如下:

#include <iostream>

using namespace std;
template<typename T>
class MyClass{
    T t;
};
template class MyClass<int>;
int main()
{
    //template class MyClass<int>;
    return 0;
}
#包括
使用名称空间std;
模板
类MyClass{
T;
};
模板类MyClass;
int main()
{
//模板类MyClass;
返回0;
}
以及:

#包括
使用名称空间std;
模板
类MyClass{
T;
};
//模板类MyClass;
int main()
{
模板类MyClass;
返回0;
}
模板类MyClass无效。错误为错误:“模板”之前应为主表达式

但是main()函数外的同一条语句可以工作。为什么会发生这种情况?

我认为14.7.2[temp.explicit]第3段中的这条语句意味着显式模板实例化必须出现在命名空间范围内:

。。。显式实例化应出现在其模板的封闭名称空间中


这意味着您不能使用函数区域设置类型显式实例化模板。由于显式模板实例化的目的是避免重复使用多个模板实例化,例如实例化流类型,因此该限制不是约束性的。

我敢问,后者有什么意义?我的意思是,你有没有理由认为你需要这个?甚至是试图将一个显式实例化的范围限制到一个函数的问题?我正在读David Vandevoorde的C++模板:完整的指南6.2.1。我碰巧在Min()函数里面写了代码>模板类Myclass < /Cord>。没有特殊的原因。
#include <iostream>

using namespace std;
template<typename T>
class MyClass{
    T t;
};
//template class MyClass<int>;
int main()
{
    template class MyClass<int>;
    return 0;
}