クラスがあるとします
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> >
ただし、2 番目の引数 (非テンプレート引数) については可能です。
これに対する 1 つの解決策は、呼び出しを f() に変更して、このように呼び出すことf<float>(...)
です。
別の解決策は、v1 を shared_ptr として宣言してconst vector<float>.
- ここでテンプレートのインスタンス化の動作が非常に異なるのはなぜですか?
- メソッドへの as 引数を持つことについての私の理解は
shared_ptr<const T>
、メソッドがshared_ptr
が指しているものを変更できないということです。shared_ptr
s を生のポインタに変更し、を への生のポインタとして変更するとv1
、コードは正常にコンパイルされます。テンプレート演繹を破るのは sについて何ですか?v2
vectors
shared_ptr