Как обьвить шаблонный метод у класса-шаблона за пределами интерфейса этого класса
--вот маленький пример ------------------------------------------------
#include <cstdio>
#define INSIDE_INTEFACE_DEFINITION
template <class T> class Number {
public:
typedef T elementType;
template <class U> Number<T>& operator=(U const& a)
#ifdef INSIDE_INTEFACE_DEFINITION
{
this->value=T(a);
return (*this);
}
#else
;
#endif
T GetValue() const;
private:
elementType value;
};
#ifndef INSIDE_INTEFACE_DEFINITION
template <class T>
template <class U>
Number<T>& Number<T>:operator=(U const& a) {
this->value=T(a);
return (*this);
}
#endif
template <class T> T Number<T>::GetValue() const {
return (this->value);
}
int main() {
Number<float> f;
f=3;
std:printf("%3.2f\n", f.GetValue());
return 0;
}
-----------------------------------------------------------------------
макрос "INSIDE_INTEFACE_DEFINITION" используется для опредиление метода в интерфейсной части, а в отключеном состоянии за пределами.
Интересует, почему регается еомпилятор при отключеном макросе, тоесть при обьявлении метода за пределам интерфейса класса?
Во многих книгах эта тема даже не подымается, а в тех что есть мельком рекомендаци и приметы (я сделал, мне так кажется, именно так) не работают. Компилятор ругается на второй идентификатор "template".
Подскажите, пожалуйста! Меня на худой конец устроит и реализация в интерфейсной части, но все же ... хотелось узнать что это за байда такая!
А как именно ругается компилятор? У меня этот код BDS 2006 съедает без вопросов...
Вот что выдает компилятор:
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.00.9466 for 80x86
Copyright (C) Microsoft Corporation 1984-2001. All rights reserved.
templateMethod_Of_templateClass.cpp
C:\Temp\templateMethod_Of_templateClass.cpp(28) : error C2988: unrecognizable template declaration/definition
C:\Temp\templateMethod_Of_templateClass.cpp(28) : error C2059: syntax error : ''template<''
C:\Temp\templateMethod_Of_templateClass.cpp(36) : error C2365: 'T' : redefinition; previous definition was a 'template param
eter'
C:\Temp\templateMethod_Of_templateClass.cpp(36) : error C2143: syntax error : missing ';' before '{'
C:\Temp\templateMethod_Of_templateClass.cpp(36) : error C2447: '{' : missing function header (old-style formal list?)
C:\Temp\templateMethod_Of_templateClass.cpp(45) : error C2065: 'f' : undeclared identifier
Естественно, читать такой файл будет затруднительно, потому что он будет содержать код всех модулей, перечисленных директивами #include :(, но свои функции без труда найти можно поиском.
Тогда сразу всё станет на свои места.