C++ - 如何在函数声明中使用模板typedef变通方法?

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)

作品.但是这个解决方案 - 至少可以说 - 有点笨重.还有替代品吗?

bam*_*s53 6

它不仅体积庞大,而且还可以防止模板参数扣除:

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编译器未能正确诊断问题.