我有關於嵌套模板和重寫賦值運算符的問題。 假設我想要一個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函數呢?
不要使用'_reference'等類名。在命名空間範圍內以下劃線開頭的名稱是爲實現保留的。你冒着名字衝突的危險 – jalf 2009-10-26 09:41:33