我想在各种地方使用模板化的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 );
的工作原理。但是这个解决方案 - 至少可以说 - 有点笨重。还有其他选择吗?
答案 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编译器无法正确诊断问题。