Любопытный повторяющийся шаблон с операторами - PullRequest
1 голос
/ 08 апреля 2011

У меня это работает на G ++, но на Visual Studo 2008 это не скомпилируется.

template<typename T, typename DerivedT >
struct Foo
{    
    template<typename Scale>
    DerivedT operator * (const Scale i)
    {
     DerivedT result;
     return result;
    }
};

template<typename T>
struct Bar : public Foo<T, Bar<T> >
{   
    // Removing this operator gets rid of the error.
    Bar& operator * (const Bar& boo)
    {
     return *this;
    }
};

int main()
{
    Bar<float> bar;
    bar = bar * 3;

    return 0;
}

Я получаю ошибку

Error   1   error C2679: binary '*' : no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion)

Даже если я определю оператор Foo явно как int / double / float, он возвращает то же сообщение об ошибке. Есть ли способ обойти это?

EDIT: Это разваливается только тогда, когда производный класс перегружает оператор *, который также определен в базовом классе.

1 Ответ

4 голосов
/ 08 апреля 2011

Я не знаю, как вам удалось скомпилировать это с помощью g ++ (и я действительно сомневаюсь в этом), но ваш код действительно не компилируется по довольно очевидным причинам.Ваш класс Bar предоставляет только один operator *

Bar& operator * (const Bar& boo)

, и этот оператор ожидает объект Bar в качестве операнда правого размера.3 не будет работать, 3 не Bar и не может быть преобразовано в Bar.

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

Вы можете просто добавить

using Foo<T, Bar<T> >::operator *;

к определению Bar вОтобразите оператор базового класса, и он должен скомпилироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...