2009-10-26 48 views
2

我有關於嵌套模板和重寫賦值運算符的問題。 假設我想要一個refcounting類模板_reference。現在這個_reference只是 包含一個指向ref-counting對象的指針。現在的問題是,這一切工作正常, 只要我用簡單的類或結構做這個。例如。 _reference ...,嵌套模板中的運算符=(T * r)

但現在我想做一個類模板,它是一個std向量轉發它所持有的類的引用。

不,我只是張貼代碼:(它沒有做引用計數和的東西,現在,它只是這個問題我已經提取)

template <typename T> 
class _reference 
{ 
private: 
    T* p_; 

public: 

// !!! this assignment seems only to work, when T is no class template already... 
void operator= (T* r)     
{ 
    p_ = r; 
} 

// WHILE this ALWAYS works as well... 
void simplySetIt (T* r)     
{ 
    p_ = r; 
} 
}; 

template <typename T> 
class _ref_vector : public _reference<vector<T> > 
{ 
}; 

void test2() 
{ 
_reference<vector<long> > ref_ptr2; 
_ref_vector<long>   ref_ptr3; 

ref_ptr2 = new vector<long>;     // works fine. 

ref_ptr3 = new vector<long>;    // BUT: THIS doesnt work 
    ref_ptr3.simplySetIt (new vector<long>); // WHILE: this works fine... 
} 

MSVC錯誤:

error C2679: binary '=' : no operator found which takes a right-hand operand of type 
'std::vector<_Ty> *' (or there is no acceptable conversion) 

GCC-錯誤:

error: no match for 'operator=' in 'ptr3 = (((const stlp_std::allocator<long int>&) 
((const stlp_std::allocator<long int>*)(& stlp_std::allocator<long int>()))), 
(((stlp_std::vector<long int, stlp_std::allocator<long int> >*)operator new(12u)), 
((<anonymous> != 0u) ? (<anonymous>->stlp_std::vector<_Tp, _Alloc>::vector [with 
_Tp = long int, _Alloc = stlp_std::allocator<long int>] 
(<anonymous>), <anonymous>) : <anonymous>)))' 

所以,請有人解釋爲什麼賦值運算符不能在這裏工作,而簡單的SetIt函數呢?

+0

不要使用'_reference'等類名。在命名空間範圍內以下劃線開頭的名稱是爲實現保留的。你冒着名字衝突的危險 – jalf 2009-10-26 09:41:33

回答

6

基本運算符=被隱式賦值運算符隱藏,因此它不再參與重載。你需要寫_ref_vector作爲

template <typename T> 
class _ref_vector : public _reference<vector<T> > 
{ 
    using _reference<vector<T> >::operator=; 
}; 

至於有simplySetIt沒有編譯器添加的版本,查找會在基類中找到它。

+0

添加'公共'關鍵字使其工作。 – 2009-10-26 08:21:33

+0

真棒 - 爲我解決了它: 其實我不得不把公衆:在使用前,但現在它工作正常。 Thanx Martin。 – 2009-10-26 08:23:13

+0

嗯。它在我沒有公開的情況下工作正常,在gcc 4.3.4中。 – 2009-10-26 08:23:19

0

由於標準說(13.5.3):

因爲拷貝賦值運算符運算符=是隱式聲明的 一類,如果不是由用戶(12.8)宣佈,基類賦值運算符 總是由 派生類的複製賦值運算符隱藏。