Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как обьвить шаблонный метод у класса-шаблона за пределами интерфейса этого класса

12K
18 октября 2006 года
momot
7 / / 23.11.2005
Как обьвить шаблонный метод у класса-шаблона за пределами интерфейса этого класса? Указывая реализацию этого метода в интерфейсе - все ок, если пытаюсь сделать это за приделами интерфейсной части (смотрел пример в книге Страуструпа) - не работает, компилятор (Misrosoft Visual Studio 2002 v6.0.9466, компилятор версии 13.00.9466 80х86)
--вот маленький пример ------------------------------------------------
#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".

Подскажите, пожалуйста! Меня на худой конец устроит и реализация в интерфейсной части, но все же ... хотелось узнать что это за байда такая!
7.3K
19 октября 2006 года
H010d Freeze
143 / / 08.08.2006
А как именно ругается компилятор? У меня этот код BDS 2006 съедает без вопросов...
12K
19 октября 2006 года
momot
7 / / 23.11.2005
Мне уже посоветовали перейти на компилятор по новее, но все же...
Вот что выдает компилятор:

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
309
19 октября 2006 года
el scorpio
1.1K / / 19.09.2006
Если проблемы в коде, использующим директивы предпроцессора, то хорошо помогает следующий способ. Можно указать компилятору выводить исходный код, обработанный предпроцессором. Тогда в файл (не помню расширения) будет выведен компилируемый текст программы.
Естественно, читать такой файл будет затруднительно, потому что он будет содержать код всех модулей, перечисленных директивами #include :(, но свои функции без труда найти можно поиском.
Тогда сразу всё станет на свои места.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог