我想在各种地方使用模板化的typedef,以及其自身模板化函数的声明.
这是我目前的尝试
这是我目前的尝试
template<typename T> struct type{ typedef std::vector<T> sometype; } template<typename TT> void someFunction( type<TT>::sometype& myArg );
(注意,std :: vector< T>仅仅是一个例子).这不起作用,并给出编译器错误“void someFunction’的模板声明”.我已经发现我需要在类型< TT>前面输入一个类型名称,即
template<typename TT> void someFunction( typename type<TT>::sometype& myArg );
作品.但是这个解决方案 – 至少可以说 – 有点笨重.还有替代品吗?
解决方法
它不仅体积庞大,而且还可以防止模板参数扣除:
std::vector<int> a; someFunction(a); // error,cannot deduce 'TT' someFunction<int>(a);
替代方案(在C 11中)是模板别名:
template<typename T> using sometype = std::vector<T>; template<typename T> void someFunction(sometype<T> &myArg ); std::vector<int> a; someFunction(a);
您也可以使用宏,但宏不是正确的答案.
#define sometype(T) std::vector<T> template<typename T> void someFunction( sometype(T) &myArg);
另外,我认为你对sometype的定义在C11之前是无效的.它不应该有这个typename:
template<typename T> struct type{ typedef std::vector<T> sometype; };
我认为C 11改变了规则以允许它,但是一些C 03编译器未能正确诊断问题.