传递派生模板类的向量

Posted

技术标签:

【中文标题】传递派生模板类的向量【英文标题】:Passing vector of derived, templated class 【发布时间】:2015-06-02 21:05:41 【问题描述】:

我想定义一个通用函数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】:

首先注意std::vector&lt;Base&lt;T&gt; &gt;std::vector&lt;Derived&lt;T&gt; &gt; 是不同的类型,即使Base&lt;std::vector&lt;T&gt;&gt;Derived&lt;T&gt; 的基础。模板类型推导中不会发生类型转换。因此,T 不能通过将您传递给barstd::vector&lt;Derived&lt;double&gt;&gt; 类型的第二个参数ystd::vector&lt;Base&lt;T&gt;&gt; 匹配来推断。

接下来,假设我们将y设为“正确”类型

std::vector< Base<double> > y; 

所以你可以将它传递给bar。现在原则上我们可以通过将std::vector&lt;Base&lt;T&gt;&gt; 类型的bar 中的第二个参数与ystd::vector&lt; Base&lt;double&gt; &gt; 类型匹配来推断T。所以T 被推导出为double,但是不要忘记x,作为第一个参数传递给bar,其类型为vector&lt;double&gt;,所以从x 我们将推导出Tvector&lt;double&gt;,当然与y推导出的double不一致。所以类型推导失败。

Here 是一个简化的示例,可以复制您的问题。

【讨论】:

当然,但就我而言,xy 是一致的。编译器会捕获类似于您发布的内容,不是吗? 对,但我的代码中的问题似乎不是模板参数不一致,而是无法识别Derived&lt;double&gt;Base&lt; std::vector&lt;double&gt; &gt;。我同意代码容易受到您强调的那种错误的影响。 我想我只是想更详细地了解为什么无法推断出T 问题您尝试将vector&lt;Derived&lt;double&gt;&gt;vector&lt;Base&lt;T&gt;&gt; 匹配,这对于编译器而言完全不相关,即使DerivedBase 是相关的。暂时忽略x,只关注第二个参数。请参阅我发布的示例 live on Coliru。 我想我现在在同一个页面上。有没有办法通知编译器两个类之间的关系?或者一般来说是一种修复它而不指定bar 采用vector&lt;Derived&lt;T&gt; &gt; 的方法?非常感谢您一直以来的帮助!

以上是关于传递派生模板类的向量的主要内容,如果未能解决你的问题,请参考以下文章

具有不同模板的派生类对象的向量

最佳实践:将派生类的向量传递给基类向量上的方法

具有派生类的模板化数据类型

派生类模板看不到基类的成员[重复]

派生类的模板类作为函数的参数 - 危险?

将派生类指针的向量传递给线程