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