Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
[progeR]
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
Завершенные тесты: 1
1

Шаблон: Метод text() не определен для объекта класса TreeWidget

28.05.2015, 11:27. Просмотров 342. Ответов 11
Метки нет (Все метки)

Есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
template<MainMenuGenerator::ElementTypes type, class T> TreeWidgetItem *MainMenuGenerator::_addMenuItem(const String &line, T *parent) const
{
    const StringList &parts{line.split('_', String::SkipEmptyParts)};
    if(parts.size() != _types[type].count)
    {
        if(type == Root) qDebug() << parent->size();
        else qDebug() << parent->text(Title);
        return NULL;
    }
    ...
}
где ElementTypes - enum, а Root = 0.
Значения, как написано в ошибке компилятора, переменных type и T известны. Они равны у меня 0 и TreeWidget соответственно. Вопрос: какого хрена тогда он просматривает все ветки if-else и пишет ошибку, мол метод text() не определен для объекта класса TreeWidget, если должен был посмотреть только равенство в операторе if (которое выполняется, т.к. 0 = 0) и на этом успокоится?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2015, 11:27
Ответы с готовыми решениями:

При возврате объекта из функции пишет, что для объекта не определен констуктор копирования
Пишу шаблонный класс матриц. Делаю, значит, переопределение оператора + для...

Передача функции указателя на метод класса и его объекта для вызова
std::thread позволяет в качестве исполняемой функций принимать метод класса и...

Как в классе А у объекта класса B вызвать метод класса B ?
Есть Класс A и класс B . В классе B лежит объект типа ArrayList , назовём его...

Шаблоны функций, Ошибка: для использования класса шаблон требуется список аргументов шаблон
Есть у меня 3 структуры Трамвай , Троллейбус , Автобус. Для автобуса определены...

Шаблон класса двусвязного списка, метод, возвращающий указатель
Пишу шаблон класса двусвязного списка. Всё в хедере. В классе присутствует...

11
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
28.05.2015, 11:49 2
Компилятор код не выполняет, когда компилятор создаёт инстанс шаблона он проверяет, в частности, правильнось вызовов методов.
0
[progeR]
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
Завершенные тесты: 1
28.05.2015, 12:00  [ТС] 3
В моем случае правильный, который в if стоит. Код и не нужно выполнять. Достаточно сравнить константы. Почему он не сравнивает их?
Как сделать, чтобы работало?
0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
28.05.2015, 12:04 4
Цитата Сообщение от [progeR] Посмотреть сообщение
В моем случае правильный, который в if стоит.
Компилятору без разницы в if или в else, он везде проверяет, если такого метода в классе нет - выдаст ошибку.

Добавлено через 1 минуту
Цитата Сообщение от [progeR] Посмотреть сообщение
Достаточно сравнить константы
А вот этого компилятор не делает, это к правильности кода, на этапе компиляции, не относится, компилятор другие вещи проверяет, в частности, правильность вызовов методов.
0
[progeR]
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
Завершенные тесты: 1
28.05.2015, 12:08  [ТС] 5
Хорошо, как сделать так, что если класс T - это TreeWidget, то выполнять код:
C++
1
qDebug() << parent->size();
а если T - это какой-то другой класс, то код:
C++
1
qDebug() << parent->text(Title);
?
0
mymedia
193 / 193 / 120
Регистрация: 27.05.2011
Сообщений: 544
28.05.2015, 12:09 6
Сделать спецификацию шаблона
0
XZentus
201 / 199 / 65
Регистрация: 06.10.2013
Сообщений: 552
28.05.2015, 12:11 7
Объявите еще один шаблон, где явно пропишите типы:
C++
1
template<MainMenuGenerator::ElementTypes type, TreeWidget> ...
0
[progeR]
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
Завершенные тесты: 1
28.05.2015, 12:12  [ТС] 8
Т.е. явно руками написать определения функций, хотя это должен сделать компилятор? Тогда вопрос: а зачем нужны шаблоны?
0
mymedia
193 / 193 / 120
Регистрация: 27.05.2011
Сообщений: 544
28.05.2015, 12:24 9
Цитата Сообщение от [progeR] Посмотреть сообщение
Т.е. явно руками написать определения функций, хотя это должен сделать компилятор?
Да. Предполагается, что у вас код разбит на небольшие функции, и части алгоритма, специфичные для разных аргументов шаблона, можно вынести в отдельную функцию.
Цитата Сообщение от [progeR] Посмотреть сообщение
Тогда вопрос: а зачем нужны шаблоны?
Для обобщённого программирования. Например, для обобщённых контейнеров, которые есть в стандартной библиотеке и т.д.
0
[progeR]
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
Завершенные тесты: 1
28.05.2015, 12:55  [ТС] 10
Ясно, печально. Видимо разработчикам всяких компиляторов и языков неимоверно тяжело устранить очевидные недостатки...

Добавлено через 23 минуты
Я не понял, а компилятор хоть это оптимизирует:
C++
1
2
3
4
5
template<int value> void myFunction() const
{
     if(value == MY_ENUM_CONST) { trololo; }
     else { lalala; }
}
где MY_ENUM_CONST - именная константа на две функции:
C++
1
2
3
4
void myFunction() const // передано value = MY_ENUM_CONST
{
     trololo;
}
и
C++
1
2
3
4
void myFunction() const // передано все остальное
{
     lalala;
}
?
0
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
28.05.2015, 13:00 11
Цитата Сообщение от mymedia Посмотреть сообщение
Сделать спецификацию шаблона
специализацию.
Цитата Сообщение от [progeR] Посмотреть сообщение
Тогда вопрос: а зачем нужны шаблоны?
Шаблоны подразумевают, что код одинаковый, а разнятся только типы.
В твоем же примере строки 6,7 задуманы как взаимоисключающие. Т.е. они не могут быть скомпилированы для типа, который не будет поддерживать одновременно и size(), и text().
Чтобы не переписывать весь шаблон, можно заменить всего лишь упомянутые 6,7 строки на новую шаблонную функцию со специализацией:
C++
1
2
3
4
5
6
7
8
9
10
template <class T> // общий шаблон
void ShowDebug(T *parent)
{ 
     parent->text(Title);
}
template <> // специализация для TreeWidget 
void ShowDebug(TreeWidget *parent)
{ 
     parent->size();
}
1
mymedia
193 / 193 / 120
Регистрация: 27.05.2011
Сообщений: 544
28.05.2015, 13:18 12
Цитата Сообщение от [progeR] Посмотреть сообщение
Я не понял, а компилятор хоть это оптимизирует:
C++
1
2
3
4
5
template<int value> void myFunction() const
{
     if(value == MY_ENUM_CONST) { trololo; }
     else { lalala; }
}
По идее да, но необязан. По крайней мере, g++ 4.8.4 даже с выключенной оптимизацией, для разных аргументов шаблона порождает две функции, в каждой из которых присутствует только одна ветка.
0
28.05.2015, 13:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2015, 13:18

Метод класса с копией объекта
Есть класс. Есть метод, который вычисляет одно из полей класса, оперируя...

Передача объекта в метод класса
здравствуйте. в процессе написания программы возник такой вопрос. можно ли при...

Передача неизвестного объекта в метод класса
Ситуация такова: имеется класс (в зачаточном состоянии) class Archer {...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru