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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с инстанциированием шаблонного метода, В шаблонном классе (gcc) 
V
    Опции темы
SaDFromSpb
Дата 6.4.2008, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

#include <iostream>

class A {
public:
  template<class T>
  void func() {
    std::cout << sizeof(T) << std::endl;
  }  
};


class B {
public:
  
  B() {
    m_inner.func<int>();   // Все нормально
  }

private:
  A m_inner;
};


template <class Inner>
class C {
public:
  
  C() {
    m_inner.some_other_func();  // Чистые функции проглатывает. (Не важно, что у меня нет класса с таким методом. До инстанциирования шаблона дело еще не дошло)
    m_inner.func<int>();               // Здесь появляется ошибка
  }

private:
  Inner m_inner;
};


int main (void) {

  return 0;
}



GCC (версии 3.2.3, 3.3.3 и 4.1.2) выдают ошибку 
main.cpp:50: error: expected primary-expression before ‘int’
main.cpp:50: error: expected `;' before ‘int’

На строчке m_inner.func<int>();

Пример максимально упрощен. В реальном проекте ошибка выглядит по-другому: " syntax error before `>' token"
Интеловский компилятор (9.1) прекрасно справляется.

Это у gcc какие-то проблемы, или я чего-то не понимаю?



--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
JackYF
Дата 6.4.2008, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(SaDFromSpb @  6.4.2008,  15:20 Найти цитируемый пост)
Это у gcc какие-то проблемы?

Похоже, что так. g++ 4.2.3 и 4.3.0 выдали аналогичное. Запости им в багзиллу.

Нет, не так. Дело в том, что данная конструкция должна записаться так:

Код

m_inner.template func<int>();     


Это сообщение отредактировал(а) JackYF - 6.4.2008, 17:28


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
SaDFromSpb
Дата 6.4.2008, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



JackYF,  Решил полазить по их багзиле. Залез в раздел Known not-bugs. Начал листать, что там понаписано, и обнаружил весьма и весьма интересную форму записи. Проблема там описывалась совсем другая, но пример синтаксиса помог разобраться с моей проблемой:

Код

m_inner.template func<int>();


P.S.  Офигеть!   smile

Добавлено через 3 минуты и 19 секунд
Старая прописная истина:
Если пишешь что-нибудь сколько-нибудь серьезное, то обязательно, ОБЯЗАТЕЛЬНО нужно попробовать пособирать на нескольких популярных компиляторах.  smile

Добавлено через 3 минуты и 58 секунд
JackYF, Я быстрее  smile 

Это сообщение отредактировал(а) SaDFromSpb - 6.4.2008, 17:31


--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
JackYF
Дата 6.4.2008, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



 smile 
Цитата(SaDFromSpb @  6.4.2008,  16:29 Найти цитируемый пост)
JackYF, Я быстрее

16:28 > 16:29 ? ;)


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
georain
Дата 19.6.2008, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Тоже с этим столкнулся.
Код

    m_inner.template func<int>();

Ппц, это что такое? Это в стандарте то есть?

У меня ещё и так работает:
Код

    Parent::template read<Type>();

и так:
Код

    this->template read<Type>();


Причём icc опять всё компилирует без проблем:
Код

    Parent::read<Type>();
    this->read<Type>();


Добавлено через 12 минут и 27 секунд
OFF TOPIC:
Кто нибудь знает как в gcc обойти проблему невозможности сделать в классах специализацию шаблонных методов (ну кроме как делать шаблонные функции вне класса)?
PM MAIL   Вверх
SABROG
Дата 19.6.2008, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(georain @  19.6.2008,  12:14 Найти цитируемый пост)
Кто нибудь знает как в gcc обойти проблему невозможности сделать в классах специализацию шаблонных методов (ну кроме как делать шаблонные функции вне класса)? 


По стандарту специализация шаблона должна быть за пределами класса. Что самое прискорбное, так это то, что MSVC понимает специализацию только внутри класса, а снаружи нет.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Alek86
Дата 19.6.2008, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

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



Цитата(georain @  19.6.2008,  12:14 Найти цитируемый пост)
Ппц, это что такое? Это в стандарте то есть?

да
слово template говорит о том, что после него точно инстанциация шаблона

Цитата(georain @  19.6.2008,  12:14 Найти цитируемый пост)
Причём icc опять всё компилирует без проблем:

это не стандартное поведение


--------------------
user posted image    user posted image
PM MAIL   Вверх
JackYF
Дата 19.6.2008, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(georain @  19.6.2008,  11:14 Найти цитируемый пост)
Ппц, это что такое? Это в стандарте то есть?

Есть.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
georain
Дата 19.6.2008, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



OFFTOP:

Как сделать специализацию функции func() ?
Код

template <class G>
class A{
public:

    template <class T>
    void func(){};

};

PM MAIL   Вверх
UnrealMan
Дата 19.6.2008, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(georain @  19.6.2008,  15:51 Найти цитируемый пост)
Как сделать специализацию функции func() ?

Код

template <class G>
    class A{
public:
    template <class T>
        void func() {}
};

template <>
    template <>
        void A<char>::func<int>()
{
    std::cout << "A<char>::func<int>()" << std::endl;
}


Это сообщение отредактировал(а) UnrealMan - 19.6.2008, 20:03
PM MAIL   Вверх
vinter
Дата 19.6.2008, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



del

Это сообщение отредактировал(а) vinter - 19.6.2008, 20:18


--------------------
Мой блог
PM MAIL WWW   Вверх
georain
Дата 20.6.2008, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(UnrealMan @ 19.6.2008,  19:59)
Цитата(georain @  19.6.2008,  15:51 Найти цитируемый пост)
Как сделать специализацию функции func() ?

Код

template <class G>
    class A{
public:
    template <class T>
        void func() {}
};

template <>
    template <>
        void A<char>::func<int>()
{
    std::cout << "A<char>::func<int>()" << std::endl;
}

А как сделать специализацию функции для всего шаблонного класса? Т.е. чтобы для всех классов этого шаблона функция была специализированна одинаково?

Заказал "C++ Templates. The Complete Guide".
PM MAIL   Вверх
Alek86
Дата 20.6.2008, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

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



Цитата(georain @  20.6.2008,  09:49 Найти цитируемый пост)
А как сделать специализацию функции для всего шаблонного класса? Т.е. чтобы для всех классов этого шаблона функция была специализированна одинаково?

может, лучше перегрузить?

Добавлено через 26 секунд
Цитата(georain @  20.6.2008,  09:49 Найти цитируемый пост)
Заказал "C++ Templates. The Complete Guide".

правильное решение
умная, блин, книжка smile


--------------------
user posted image    user posted image
PM MAIL   Вверх
georain
Дата 20.6.2008, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Alek86 @  20.6.2008,  10:04 Найти цитируемый пост)
может, лучше перегрузить?

Если бы можно было просто перегрузить то зачем столько шуму smile
PM MAIL   Вверх
Alek86
Дата 20.6.2008, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

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



Цитата(georain @  20.6.2008,  12:59 Найти цитируемый пост)
 зачем столько шуму

это мой второй вопрос )


--------------------
user posted image    user posted image
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0660 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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