Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование шаблонов, небольшая проблема 
:(
    Опции темы
Jcs
Дата 17.2.2004, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 1.10.2003

Репутация: нет
Всего: нет



Код
template<typename T> struct CSrtdData
{
...
template<typename T1> bool cmp_def(T& item,T1& _item)
{return true;}
                ...
};

Как вынести определение функции за пределы описания класса? Заранее спасибо.
PM   Вверх
Дрон
Дата 17.2.2004, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Если я правильно понял вопрос, то можно так:

Код
template<typename T, typename T1>
class CSrtdData
{
...
bool cmp_def(T& item,T1& _item);
...
};

template<typename T, typename T1>
bool CSrtdData<T,T1>::cmp_def(T& item,T1& _item){
...
}



--------------------
Да. Именно так.
PM   Вверх
Jcs
Дата 17.2.2004, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 1.10.2003

Репутация: нет
Всего: нет



Для всего класса мне необходим только один шаблонный параметр, за исключением функции cmp_def. Ведь можно же ее определить внутри описания класса, значит можно и вне его, просто , наверное, все дело в синтаксисе. Просто объявлять весь класс с двумя шаблонными параметрами из-за одной только функции кажется мне не совсем логичным, может быть стоит объявит ее дружественной... Но если ничего не получится, придется последовать предложенному способу. Спасибо за ответ.
PM   Вверх
mr.DUDA
Дата 18.2.2004, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Цитата
Для всего класса мне необходим только один шаблонный параметр, за исключением функции cmp_def.

Нелогично. В данном случае ведь речь идёт не о классе, а о шаблоне класса - т.е. типизированном генераторе классов (компилятор порождает новый класс каждый раз при упоминании шаблона с новым параметром в треугольных скобках). Получается, что если заключить в пределы шаблона (или пусть даже обычного класса) шаблон функции, то выйдет "пирог внутри пирога" - компилятор запутается, сколько и каких классов ему генерировать при вызове функции (скажем cmp_ref) с тем или иным типом в треугольных скобках.

З.Ы. по-всякому попытавшись объявить реализацию функции вне класса, у меня лично ничего не получилось:
Цитата
template<typename T> struct CSrtdData
{

template<typename T1> bool cmp_def(T& item,T1& _item);

};


template <typename T, typename T1>
bool CSrtdData<T>::cmp_def(T& item, T1& _item)
{
return false;
}



--------------------
user posted image
PM MAIL WWW   Вверх
Jcs
Дата 18.2.2004, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 1.10.2003

Репутация: нет
Всего: нет



Действительно, компилятор пишет, что описание функции отличается от определения. Если использовать дружественную функцию
Код

template<typename T> class CSrtdData
{
T* data_ptr;
template<typename T1> friend bool cmp_def(T& item,T1& _item);

};

template <typename T, typename T1>
bool cmp_def(T& item, T1& _item)
{
CSrtdData<T> grid;
grid.data_ptr = 0;    // error, cannot access to private member
return true;
}

, то компилятор пропускает, но если у нас CSrtdData будет классом с закрытыми членами, то эта функция доступа к ним почему-то иметь не будет. Видимо из-за того, что не обязательно T в определении функции и ее описании будут одним и тем же. Придется использовать определение функции-члена внутри класса.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1199 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.