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

时间:2012-03-22 14:27:47

标签: c++ templates typedef

我想在各种地方使用模板化的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'的模板声明”。我已经发现我需要在typename前放type<TT>,即

template<typename TT>
void someFunction( typename type<TT>::sometype& myArg );

的工作原理。但是这个解决方案 - 至少可以说 - 有点笨重。还有其他选择吗?

1 个答案:

答案 0 :(得分:6)

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

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的定义在C ++ 11之前是无效的。它不应该有这个类型名称:

template<typename T>
struct type{ typedef std::vector<T> sometype; };

我认为C ++ 11更改规则以允许它,但是某些C ++ 03编译器无法正确诊断问题。