operator = (T * r) во вложенных шаблонах - PullRequest
2 голосов
/ 26 октября 2009

У меня проблема с вложенными шаблонами и переопределением оператора присваивания. Скажем, я хочу иметь шаблон класса пересчета _reference. Эта ссылка сейчас просто содержит указатель на пересчитанный объект. Проблема в том, что все это работает нормально, пока я делаю это с простыми классами или структурами. например. _reference ...,

Но теперь я хочу создать шаблон класса, который является ссылкой на 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>)))'

Так, пожалуйста, кто-нибудь может объяснить мне, почему здесь не работает оператор присваивания, а функция simpleStIt -?

Ответы [ 2 ]

6 голосов
/ 26 октября 2009

Базовый оператор = скрывается неявными операторами присваивания, поэтому он больше не участвует в перегрузке. Вам нужно написать _ref_vector как

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

Поскольку не существует добавленной компилятором версии simplySetIt, средство поиска найдет ее в базовом классе.

0 голосов
/ 26 октября 2009

Как сказано в стандарте (13.5.3):

Поскольку оператор оператора копирования = неявно объявлен для класс, если он не объявлен пользователем (12.8), присвоение базового класса оператор всегда скрыт оператором копирования производный класс.

...