传递派生的模板化类

时间:2015-06-02 21:05:41

标签: c++ templates vector

我想定义一个获取数据的通用函数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> >’

如果答案在于已发布的帖子,请原谅我;我已经读了很多看似相关的数字,但据我所知,这个数字并没有解决这个问题。

1 个答案:

答案 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是一个复制问题的简化示例。