C++ 警告:";“不良存储等级”;在VS 2012中使用模板
我在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
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)