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

前端之家收集整理的这篇文章主要介绍了C – 如何在函数声明中使用模板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’的模板声明”.我已经发现我需要在类型< 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编译器未能正确诊断问题.

猜你在找的C&C++相关文章