помогите написать правильно конструкцию типа
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
Как такое сделать?
Спасибо.
Здравствуйте, 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>Спасибо.
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;
}