Как обьвить шаблонный метод у класса-шаблона за пределами интерфейса этого класса
--вот маленький пример ------------------------------------------------
#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".
Подскажите, пожалуйста! Меня на худой конец устроит и реализация в интерфейсной части, но все же ... хотелось узнать что это за байда такая!
меняй компилятор
P.S. а вот кросспостинг в форуме преследуется по закону.
тест на 2003, 2005, ICL 9.0 - всё ОК. см.Green
Спасибо! Значит нужно будет еще онду студию поновее поставить 8)
Возможно, именно это и непонимает компилятор...
Это один из багов с шаблонными методами за которые я и не люблю ее. Переходите на версию более соответствующую стандарту.
Возможно, именно это и непонимает компилятор...[/QUOTE]
Не имеет значения
И есть ли у кого-нибудь из участников VS2005 версии не ниже Professional?
Тем более по даже сравнению с 2003 мной лично обноруженно исправление довольно многих недочетов и несоответсвий языку )
Может тогда пример приведете, который в 2003 не работает, а в 2005 работает. У меня 2003 стоит...
"C++ compliance"
Подставляя к этому словосочетанию версии компиляторов, получаем много интересной информации:
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=23760&SiteID=1
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/vclrfStandardComplianceIssuesInVisualC.asp
http://support.microsoft.com/default.aspx?scid=KB;en-us;q243451
и т.п.
Это интересно. Может среди вас есть люди которые работают с gcc? Слышал, что этот компилятор более стабилен и уже давно соответствует стандарту. Или я не прав?