我在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;
}
我收到此错误,
nestedtemplate.h(17): warning C4042: 'o1' : has bad storage class
nestedtemplate.h(17): warning C4042: 'o2' : has bad storage class
我收到此错误的原因。这段代码在VS2008中没有任何错误。
答案 0 :(得分:0)
您不能将explicit
关键字用于此类函数参数。将签名更改为
template<typename T> template<typename Q>
void outer<T>::inner<Q>::iid(T o1, Q o2)
将修复错误。
explicit
关键字用于单参数构造函数(以及C ++ 11中的转换运算符),以指定编译器不应自动执行转换,但仅在程序员明确指定时才执行此操作这应该。它很有用(我会推荐),以避免在代码中出现奇怪的错误。
我不确定您使用explicit
的确是做什么的 - 您能否提供更多详细信息,以便我们建议合法的替代方案?