假設我有一類C++與shared_ptr的模板實例爲const牛逼
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>.
問題1)爲什麼模板實例在這裏表現如此不同?
問題2)我對將一個shared_ptr用作方法參數的理解是方法 無法更改shared_ptr指向的內容。如果我們將shared_ptr改爲原始指針,並將v1,v2更改爲向量的原始指針,那麼代碼將很好地編譯。關於打破模板推演的shared_ptrs,什麼是 ?
第三種解決方案是將'v1'更改爲'std :: tr1 :: shared_ptr'。 –
sbi
2011-04-08 20:03:49
但我不想這樣做,因爲我想確保f不會以任何方式改變參數。所有可以改變的是我如何在調用代碼a.f(...)中聲明v1和v2。 – Amitabha 2011-04-08 20:09:51
我沒想到你會喜歡這個,只是你可能的解決方案的列舉看起來不完整。 ':)' – sbi 2011-04-08 20:24:41