我想使用模板将BaseClass强制转换为DerivedClass标准向量:
template<typename T, typename U>
vector<U> CastTo<U>(vector<T> &input)
{
vector<U> output;
for (auto obj : input)
{
output.push_back(dynamic_cast<U>(obj));
}
return output;
}
这可能吗?
现在模板未被识别,我无法使用它。建议的方式是否有错误?
用法是:
vector<BaseClass*> vec;
vector<DerivedClass*> dVec = CastTo<DerivedClass*>(vec);
答案 0 :(得分:4)
template<typename T, typename U>
vector<U> CastTo<U>(vector<T> &input)
^^^
删除<U>
(为什么用于宏的ALL_UPPERCASE?)。另请注意,您的示例调用可能会让T
和U
混淆。
答案 1 :(得分:3)
两件事,
<U>
,CastTo<U>
行中交换T
和U
的顺序。第一个是函数模板的语法在C ++中的用法:名称后面没有模板括号。 (但是在调用函数时你需要一个。)
第二个更棘手。如果您使用template
函数并调用template<typename T, typename U>
,那么CastTo<DerivedClass*>(vec)
将与第一个参数DerivedClass*
匹配,无法确定T
:< / p>
U
如果它是CastTo<DerivedClass*, ???>(vec): vector<DerivedClass*> &input -> ???
===== T ===== =U= ↑ T
> template argument deduction/substitution failed:
> couldn't deduce template parameter ‘U’
,那么template<typename U, typename T>
将U
,DerivedClass*
可以从函数的参数T
中找到:
vec
这是有效的(使用基本类型和C样式转换的最小示例):
1. CastTo<DerivedClass*, ???>(vec): vector<???> &input -> vector<DerivedClass*>
===== U ===== =T= ↑ vec ↑ U
2. vec is a vector<BaseClass*> => T = BaseClass*
> OK