Шаблонные операторы - для простых типов, свои - для UDT
От: Снорк  
Дата: 12.05.03 12:54
Оценка:
class Serializer
{
    public:
    Serializer(){}
    ~Serializer(){}

    template<class T>
    Serializer& operator >> (T& object)
    {
        // реализация
        return *this;
    }

    Serializer& operator >> (MyClassType& object)
    {
        // реализация
        return *this;
    }
}


При попытке использования
Serializer s;
MyClassType object;
s >> object;
VC6 пишет, что не может определить, какую из двух реализаций использовать. Можно ли разрешать такие коллизии, явно вызывая нужную реализацию? Учитывая, что перегрузка оператора >> служит для компактности и красоты кода, хотелось бы иметь возможность делать это столь же компактно.
Re: Шаблонные операторы - для простых типов, свои - для UDT
От: MaximE Великобритания  
Дата: 12.05.03 13:05
Оценка:
Здравствуйте, Снорк, Вы писали:

VC6 пишет, что не может определить, какую из двух реализаций использовать. Можно ли разрешать такие коллизии, явно вызывая нужную реализацию? Учитывая, что перегрузка оператора >> служит для компактности и красоты кода, хотелось бы иметь возможность делать это столь же компактно.

Видимо, шестерка врет. На 7.1 все ok.
Re[2]: Шаблонные операторы - для простых типов, свои - для U
От: Lorenzo_LAMAS  
Дата: 12.05.03 13:07
Оценка:
Как-то на рсдн был похожий вопрос. Правда там все было хуже, там была проблема в отсутствии поддержки частичного упорядочения. Но некто Alxey Chen предложил решение. Сорри, не смог найти ссылку.
Of course, the code must be complete enough to compile and link.
Re[2]: Шаблонные операторы - для простых типов, свои - для U
От: Снорк  
Дата: 12.05.03 13:07
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Здравствуйте, Снорк, Вы писали:


ME>VC6 пишет, что не может определить, какую из двух реализаций использовать. Можно ли разрешать такие коллизии, явно вызывая нужную реализацию? Учитывая, что перегрузка оператора >> служит для компактности и красоты кода, хотелось бы иметь возможность делать это столь же компактно.


ME>Видимо, шестерка врет. На 7.1 все ok.


Кажется разобрался. Я пропустил template<class T> перед второй реализацией. С ним комплируется и работает без проблем.
Re[3]: Шаблонные операторы - для простых типов, свои - для U
От: Lorenzo_LAMAS  
Дата: 12.05.03 13:08
Оценка:
Покажи, пожалуйста, как ты исправил. Скорее всего, тут тоже глюк
Of course, the code must be complete enough to compile and link.
Re: Шаблонные операторы - для простых типов, свои - для UDT
От: Bell Россия  
Дата: 12.05.03 13:09
Оценка:
Здравствуйте, Снорк, Вы писали:

У меня на VC5SP5 все нормально компилится и работает. На всякий случай попробуй так:

...
template<>
Serializer& operator >> (MyClassType& object)
...
Любите книгу — источник знаний (с) М.Горький
Re[2]: Шаблонные операторы - для простых типов, свои - для U
От: Bell Россия  
Дата: 12.05.03 13:31
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Снорк, Вы писали:


B>У меня на VC5SP5 все нормально компилится и работает. На всякий случай попробуй так:

Сорри... VC6SP5.

B>
B>...
B>template<>
B>Serializer& operator >> (MyClassType& object)
B>...
B>


И так внутри Serializer писать нельзя (14.7.3/2), хотя мой VC6SP5 это съел. А Comeau — нет, что абсолютно верно.

Правильный вариант должен выглядеть так:

#include <iostream>

class MyClassType;
class Serializer
{
    public:
    Serializer(){}
    ~Serializer(){}

    template<class T>
    Serializer& operator >> (T& object)
    {
        std::cerr << "Template" << std::endl;
        return *this;
    }

};

template<>
    Serializer& Serializer::operator >> <MyClassType> (MyClassType& object)
    {
        std::cerr << "MyClassType" << std::endl;
        return *this;
    }


class MyClassType {};

int main(int argc, char** argv)
{
   Serializer s;
   MyClassType object;
   s >> object;

   return 0;
}


Хотя тут уже VC6 перестает компилить этот код
Любите книгу — источник знаний (с) М.Горький
Re[3]: Шаблонные операторы - для простых типов, свои - для U
От: Lorenzo_LAMAS  
Дата: 12.05.03 13:41
Оценка:
B>Хотя тут уже VC6 перестает компилить этот код

Что ему теперь не нравится?
Of course, the code must be complete enough to compile and link.
Re[4]: Шаблонные операторы - для простых типов, свои - для U
От: Bell Россия  
Дата: 12.05.03 13:54
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

B>Хотя тут уже VC6 перестает компилить этот код


L_L>Что ему теперь не нравится?


...
template<>
Serializer& Serializer::operator >> <MyClassType> (MyClassType& object)
...




error C2143: syntax error : missing ';' before '<'
Любите книгу — источник знаний (с) М.Горький
Re[5]: Шаблонные операторы - для простых типов, свои - для U
От: Lorenzo_LAMAS  
Дата: 12.05.03 13:57
Оценка:
Так это ж легко обойти, не пиши <MyClassType> и все, ведь и так он виден из типа аргумента.
Of course, the code must be complete enough to compile and link.
Re[6]: Шаблонные операторы - для простых типов, свои - для U
От: Bell Россия  
Дата: 12.05.03 14:08
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Так это ж легко обойти, не пиши <MyClassType> и все, ведь и так он виден из типа аргумента.

Только не в этом случае

template<>
Serializer& Serializer::operator >> (MyClassType& object)


error C2511: '>>' : overloaded member function 'class Serializer &(class MyClassType &)' not found in 'Serializer'
Любите книгу — источник знаний (с) М.Горький
Re[7]: Шаблонные операторы - для простых типов, свои - для U
От: Lorenzo_LAMAS  
Дата: 12.05.03 14:09
Оценка:
Ну так это очередной глюк Должно работать.
Of course, the code must be complete enough to compile and link.
Re[8]: Шаблонные операторы - для простых типов, свои - для U
От: Bell Россия  
Дата: 12.05.03 14:27
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Ну так это очередной глюк Должно работать.

Так о чем и речь Comeau — то компилит, да и в стандарте черным по белому написано, что должно...
Любите книгу — источник знаний (с) М.Горький
Re[4]: Шаблонные операторы - для простых типов, свои - для U
От: Снорк  
Дата: 12.05.03 15:05
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Покажи, пожалуйста, как ты исправил. Скорее всего, тут тоже глюк


Ага, а тут уже куча ответов!
Примерно, как Bell написал, так же и я. Естественно, мне не до Comeau, я оставил VCPP6-вариант.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.