我想定义一个获取数据的通用函数foo
,可能操作底层的类变量,并返回int
。但是,当我尝试创建一个带有foo
对象向量的单独函数时,编译器无法推导出模板参数。以下说明了我尝试过的内容:
#include <vector>
template <typename T>
class Base {
public:
virtual int foo(const T& x) const = 0;
};
template <typename T>
class Derived : public Base<std::vector<T> > { // specialize for vector data
public:
virtual int foo(const std::vector<T>& x) const { return 0;}
};
template <typename T>
int bar(const T& x, const std::vector< Base<T> >& y) {
if(y.size() > 0)
return y[0].foo(x);
}
int main(int argc, char** argv) {
std::vector<double> x;
std::vector< Derived<double> > y;
bar(x, y);
}
这找不到bar
的匹配函数,注释为:
main.cc:16:5: note: template argument deduction/substitution failed:
main.cc:24:11: note: mismatched types ‘Base<T>’ and ‘Derived<double>’
和
main.cc:24:11: note: ‘std::vector<Derived<double> >’ is not derived \
from ‘const std::vector<Base<T> >’
如果答案在于已发布的帖子,请原谅我;我已经读了很多看似相关的数字,但据我所知,这个数字并没有解决这个问题。
答案 0 :(得分:4)
首先请注意std::vector<Base<T> >
和std::vector<Derived<T> >
是不同的类型,即使Base<std::vector<T>>
是Derived<T>
的基础。模板类型推导不会发生类型转换。因此,T
无法通过匹配您y
传递给std::vector<Derived<double>>
的{{1}}类型的第二个参数bar
来推断出来。
接下来,假设我们{&#34;对'&#34; std::vector<Base<T>>
型
y
因此您可以将其传递给std::vector< Base<double> > y;
。现在原则上我们可以通过将bar
类型的T
中的第二个参数与bar
的类型std::vector<Base<T>>
进行匹配来推导std::vector< Base<double> >
。因此y
被推断为T
,但请不要忘记double
,其作为x
的第一个参数传递,其类型为bar
,因此,vector<double>
我们会将x
推断为T
,这当然与vector<double>
推导出的double
不一致。所以类型扣除失败。
Here是一个复制问题的简化示例。