传递派生模板类的向量
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<Base<T> >
和std::vector<Derived<T> >
是不同的类型,即使Base<std::vector<T>>
是Derived<T>
的基础。模板类型推导中不会发生类型转换。因此,T
不能通过将您传递给bar
的std::vector<Derived<double>>
类型的第二个参数y
与std::vector<Base<T>>
匹配来推断。
接下来,假设我们将y
设为“正确”类型
std::vector< Base<double> > y;
所以你可以将它传递给bar
。现在原则上我们可以通过将std::vector<Base<T>>
类型的bar
中的第二个参数与y
的std::vector< Base<double> >
类型匹配来推断T
。所以T
被推导出为double
,但是不要忘记x
,作为第一个参数传递给bar
,其类型为vector<double>
,所以从x
我们将推导出T
如vector<double>
,当然与y
推导出的double
不一致。所以类型推导失败。
Here 是一个简化的示例,可以复制您的问题。
【讨论】:
当然,但就我而言,x
和 y
是一致的。编译器会捕获类似于您发布的内容,不是吗?
对,但我的代码中的问题似乎不是模板参数不一致,而是无法识别Derived<double>
是Base< std::vector<double> >
。我同意代码容易受到您强调的那种错误的影响。
我想我只是想更详细地了解为什么无法推断出T
。
问题是您尝试将vector<Derived<double>>
与vector<Base<T>>
匹配,这对于编译器而言完全不相关,即使Derived
和 Base
是相关的。暂时忽略x
,只关注第二个参数。请参阅我发布的示例 live on Coliru。
我想我现在在同一个页面上。有没有办法通知编译器两个类之间的关系?或者一般来说是一种修复它而不指定bar
采用vector<Derived<T> >
的方法?非常感谢您一直以来的帮助!以上是关于传递派生模板类的向量的主要内容,如果未能解决你的问题,请参考以下文章