powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибка вызова шаблонного метода класса из шаблонного метода другого класса
7 сообщений из 7, страница 1 из 1
Ошибка вызова шаблонного метода класса из шаблонного метода другого класса
    #38190742
Не пойму, в чем ошибка следующего кода?
Вызываю шаблонный метод одного класса из шаблонного метода другого класса.

В MSVC11 (MSVS2012) компилируется нормально, а GCC 4.7.2 не хочет:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
#include<iostream>

struct T {
  int x, y;
  T() : x(3), y(5) {}
  
  template<bool flag>
  void get() { std::cout << (flag?x:y); }
};

template<typename T>
struct T_templ {
 T t;
 
 template<bool flag>
 void get_n_cout() { t.get<flag>(); }
};

int main() {
    T_templ<T> t;
    t.get_n_cout<true>();
    
    return 0;
}




сообщения компилятораprog.cpp: In member function ‘void T_templ<T>::get_n_cout()’:
prog.cpp:16:34: error: expected primary-expression before ‘)’ token
prog.cpp: In instantiation of ‘void T_templ<T>::get_n_cout() [with bool flag = true; T = T]’:
prog.cpp:21:24: required from here
prog.cpp:16:22: error: invalid operands of types ‘<unresolved overloaded function type>’ and ‘bool’ to binary ‘operator<’
...
Рейтинг: 0 / 0
Ошибка вызова шаблонного метода класса из шаблонного метода другого класса
    #38190763
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Включите еще
Код: plaintext
1.
#include <algorithm>


- должно заработать.
Почему - не спрашивайте
...
Рейтинг: 0 / 0
Ошибка вызова шаблонного метода класса из шаблонного метода другого класса
    #38190765
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, и еще using namespace std;
...
Рейтинг: 0 / 0
Ошибка вызова шаблонного метода класса из шаблонного метода другого класса
    #38190769
Anatoly MoskovskyВключите еще
Код: plaintext
1.
#include <algorithm>


- должно заработать.
Почему - не спрашивайте
А, и еще using namespace std;

Шаманство :)
Ок, "почему" не буду спрашивать, но как Вы догадались?
...
Рейтинг: 0 / 0
Ошибка вызова шаблонного метода класса из шаблонного метода другого класса
    #38190771
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в чем ошибка?Шаманство :)
Ок, "почему" не буду спрашивать, но как Вы догадались?
Я не гадал.
У меня есть заготовка для тестирования разных конструкций, в которой помимо прочего были эти две строки.
В этой заготовке ваш код откомпилировался без ошибок.
Осталось закоментарить по очереди все лишнее.

Поэтому и не в курсе что это было, т.к. мне счас не до разборок - занят.
...
Рейтинг: 0 / 0
Ошибка вызова шаблонного метода класса из шаблонного метода другого класса
    #38191968
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот корректный код с точки зрения стандарта:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
#include<iostream>

struct T {
  int x, y;
  T() : x(3), y(5) {}

  template<bool flag>
  void get() { std::cout << (flag?x:y); }
};

template<typename T>
struct T_templ {
 T t;

 template<bool flag>
 void get_n_cout() { t.template get<flag>(); }
};

int main() {
    T_templ<T> t;
    t.get_n_cout<true>();

    return 0;
}



Почему работало шаманство из предыдущих ответов - не знаю. Возможно <algorithm> этой версии GCC внутри включает режим совместимости с VS для каких-то своих нужд.
...
Рейтинг: 0 / 0
Ошибка вызова шаблонного метода класса из шаблонного метода другого класса
    #38192432
Anatoly MoskovskyВот корректный код с точки зрения стандарта:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
#include<iostream>

struct T {
  int x, y;
  T() : x(3), y(5) {}

  template<bool flag>
  void get() { std::cout << (flag?x:y); }
};

template<typename T>
struct T_templ {
 T t;

 template<bool flag>
 void get_n_cout() { t.template get<flag>(); }
};

int main() {
    T_templ<T> t;
    t.get_n_cout<true>();

    return 0;
}



Почему работало шаманство из предыдущих ответов - не знаю. Возможно <algorithm> этой версии GCC внутри включает режим совместимости с VS для каких-то своих нужд.
Точно. В стандарте я подобный пример только в разделе 23.3.5.3 внизу нашел на 514 странице. Ну и в Annex A Grammar summary на 680стр.

Кстати, а возможно как-то посмотреть код получающийся после инстанцирования всех шаблонов во время компиляции?
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибка вызова шаблонного метода класса из шаблонного метода другого класса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]