C++ 警告:";“不良存储等级”;在VS 2012中使用模板

C++ 警告:";“不良存储等级”;在VS 2012中使用模板,c++,templates,visual-studio-2012,C++,Templates,Visual Studio 2012,我在VS 2012中构建模板代码时遇到错误 template<typename T> template<typename Q> void outer<T>::inner<Q>::iid(explicit T o1,explicit Q o2){ cout<<"the two template objects are as follows"<<o1<<" "<<o2<<end

我在VS 2012中构建模板代码时遇到错误

template<typename T> template<typename Q>
void outer<T>::inner<Q>::iid(explicit T o1,explicit Q o2){

    cout<<"the two template objects are as follows"<<o1<<"    "<<o2<<endl;
    cout << "outer == "<< typeid(T).name() <<endl;
    cout << "inner == "<< typeid(Q).name() <<endl;
    cout << "Full inner == "<< typeid(*this).name() <<endl;

}

我为什么会犯这个错误。这段代码在VS2008中构建时没有任何错误。

对于这样的函数参数,不能使用
explicit
关键字。将签名更改为

template<typename T> template<typename Q>
void outer<T>::inner<Q>::iid(T o1, Q o2)
模板
空洞外部::内部::iid(TO1,Q o2)
将修复错误

explicit
关键字用于单参数构造函数(在C++11中,还有转换运算符),用于指定编译器不应自动执行转换,而仅在程序员明确指定它应自动执行转换时才这样做。这对于避免代码中出现奇怪的错误是很有用的(我甚至可以说是推荐的)


我不知道你到底想用
显式
做什么--你能给我们提供更多的细节以便我们建议一个合法的替代方案吗?

嗨,特里斯坦,但是这是如何在VS2008中实现无警告的呢?我也使用这个关键字,因为我不想在数据类型之间有任何隐式转换,作为参数传递。我不知道VS2008。。。可能它是一个非标准的扩展,也可能它只是在应该生成诊断时没有生成诊断。为了避免隐式转换,您需要确保用作
T
Q
的任何类型都没有任何非
显式的
单参数构造函数。还有一个问题,在定义编译单元的模板类时是否有任何限制。我的问题是,在另一个翻译单元中定义成员模板函数时出错。
template<typename T> template<typename Q>
void outer<T>::inner<Q>::iid(T o1, Q o2)