2

ネストされたテンプレートと代入演算子のオーバーライドに関して問題があります。refcountingクラスtemplate_referenceが必要だとします。今のところ、この_referenceは、ref-countedオブジェクトへのポインターを保持しているだけです。問題は、単純なクラスまたは構造体でこれを実行している限り、これがすべて正常に機能することです。例えば。_参照 ...、

しかし今、私はそれが保持するクラスを転送するstd-vectorへの参照であるクラステンプレートを作りたいと思います。

いや、私はコードを投稿するだけです:(それは今のところrefcountingとそのようなものをしません、それは私が持っている問題の抽出だけです)

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>)))'

では、simplySetIt-関数が機能するのに、代入演算子がここで機能しない理由を誰かに説明してもらえますか?

4

2 に答える 2

6

基本operator=は暗黙の代入演算子によって隠されるため、オーバーロードには関与しなくなります。_ref_vectorあなたは次のように書く必要があります

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

simpleSetItにはコンパイラが追加したバージョンがないため、ルックアップは基本クラスでそれを見つけます。

于 2009-10-26T08:15:17.063 に答える
0

標準が言うように(13.5.3):

コピー代入演算子operator=は、ユーザー(12.8)によって宣言されていない場合、クラスに対して暗黙的に宣言されるため、基本クラス代入演算子は、派生クラスのコピー代入演算子によって常に非表示になります。

于 2009-10-26T08:45:25.840 に答える