шабл-ый оператор шабл-го класса
От: piAnd Россия  
Дата: 10.04.06 17:09
Оценка:
помогите написать правильно конструкцию типа
template<typename T>
class CL {
public:
    //skip many code
    //шаблонный оператор присвоения
    template<typename SrcT> CL<T> operator =(const CL<SrcT> &Src);
};

template<typename T>
template<typename SrcT> CL<T> CL<T>::operator =(const CL<SrcT> &Src)
{ /* work */ }

//А здесь хочу специализировать этот шаблонный оператор некоторым SrcT == OtherT
template<typename T>
template<> CL<T> CL<T>::operator = <OtherT> (const CL<SrcT> &Src)
{ /* work */ }
//но VC2003 ругается fatal error C1001: INTERNAL COMPILER ERROR

Как такое сделать?
Спасибо.
Re: шабл-ый оператор шабл-го класса
От: zaufi Земля  
Дата: 10.04.06 17:19
Оценка: 2 (1)
Здравствуйте, piAnd, Вы писали:

A>помогите написать правильно конструкцию типа

A>
A>template<typename T>
A>class CL {
A>public:
A>    //skip many code
A>    //шаблонный оператор присвоения
A>    template<typename SrcT> CL<T> operator =(const CL<SrcT> &Src);
A>};

A>template<typename T>
A>template<typename SrcT> CL<T> CL<T>::operator =(const CL<SrcT> &Src)
A>{ /* work */ }

A>//А здесь хочу специализировать этот шаблонный оператор некоторым SrcT == OtherT
A>template<typename T>
A>template<> CL<T> CL<T>::operator = <OtherT> (const CL<SrcT> &Src)
A>{ /* work */ }
A>//но VC2003 ругается fatal error C1001: INTERNAL COMPILER ERROR
A>

A>Как такое сделать?

ты перешаблонился!!! -- просто перегрузи оператор под нужный тип
за подробностями в стандарт (точно извини не помню в каком месте) -- но это запрещено...

A>Спасибо.
Re[2]: шабл-ый оператор шабл-го класса
От: Andrew_D  
Дата: 10.04.06 22:26
Оценка:
A>template<typename T>
A>template<> CL<T> CL<T>::operator = <OtherT> (const CL<SrcT> &Src)
— запрещена такая последовательность.

#include <iostream>

template<typename Type>
class CL
{
public:
    
    CL& operator=(const CL&)
    {
        std::cout<<"default assign operator"<<std::endl;
        return *this;
    }

    template<typename T> CL& operator=(const CL<T>&)
    {
        std::cout<<"template<typename T> CL& operator=(const CL<T>&)"<<std::endl;
        return *this;
    }

    template<> CL& operator=<std::string>(const CL<std::string>&)
    {
        std::cout<<"template<> CL& operator=<std::string>(const CL<std::string>&)"<<std::endl;
        return *this;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    CL<int>            _val1;
    CL<int>            _val2;
    CL<std::string>        _val3; // здесь компилер выдаст варнинг ...
    CL<double>            _val4;
    _val1=_val2;
    _val1=_val3;
    _val1=_val4;
    return 0;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.