假设我有一堂课
template <typename T>
class A {
public:
template <typename V>
void f(std::tr1::shared_ptr<const std::vector<V> > v1,
std::tr1::shared_ptr<const std::vector<float> > v2) {}
};
以下不编译:
A<string> a;
std::tr1::shared_ptr<std::vector<float> > v1(new std::vector<float>());
std::tr1::shared_ptr<std::vector<float> > v2(new std::vector<float>());
a.f(v1, v2);
编译器错误是:
error: no matching function for call to 'A<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::f(std::tr1::shared_ptr<std::vector<float, std::allocator<float> > >&, std::tr1::shared_ptr<std::vector<float, std::allocator<float> > >&)'
编译器无法std::tr1::shared_ptr<std::vector<float> >
输入
std::tr1::shared_ptr<const std::vector<float> >
第一个参数。然而它可以用于第二个(非模板参数)。
对此的一种解决方案是将调用更改为 f(),像这样调用它f<float>(...)
。
另一种解决方案是将 v1 声明为 shared_ptr 以const vector<float>.
- 为什么模板实例化在这里表现如此不同?
- 我对
shared_ptr<const T>
方法的 as 参数的理解是,该方法不能改变shared_ptr
指向的内容。如果我们将shared_ptr
s 更改为原始指针和v1
,v2
作为指向 的原始指针vectors
,那么代码将编译得很好。shared_ptr
打破模板推导的 s 是什么?