Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
1

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

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

Author24 — интернет-сервис помощи студентам
Есть код:
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.05.2015, 11:27
Ответы с готовыми решениями:

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

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

Метод для произвольного объекта класса
Добрый вечер! Прошу совет для решения следующей задачи: на форме динамически создаются объекты...

Как создать метод с использованием объекта другого метода, который определен в другом классе
В общем суть вот в чем: У меня есть 2 класса. 1 основный(Program) в нем в методе Main создается...

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

Добавлено через 1 минуту
Цитата Сообщение от [progeR] Посмотреть сообщение
Достаточно сравнить константы
А вот этого компилятор не делает, это к правильности кода, на этапе компиляции, не относится, компилятор другие вещи проверяет, в частности, правильность вызовов методов.
0
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
28.05.2015, 12:08  [ТС] 5
Хорошо, как сделать так, что если класс T - это TreeWidget, то выполнять код:
C++
1
qDebug() << parent->size();
а если T - это какой-то другой класс, то код:
C++
1
qDebug() << parent->text(Title);
?
0
196 / 197 / 120
Регистрация: 27.05.2011
Сообщений: 545
28.05.2015, 12:09 6
Сделать спецификацию шаблона
0
202 / 200 / 65
Регистрация: 06.10.2013
Сообщений: 552
28.05.2015, 12:11 7
Объявите еще один шаблон, где явно пропишите типы:
C++
1
template<MainMenuGenerator::ElementTypes type, TreeWidget> ...
0
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
28.05.2015, 12:12  [ТС] 8
Т.е. явно руками написать определения функций, хотя это должен сделать компилятор? Тогда вопрос: а зачем нужны шаблоны?
0
196 / 197 / 120
Регистрация: 27.05.2011
Сообщений: 545
28.05.2015, 12:24 9
Цитата Сообщение от [progeR] Посмотреть сообщение
Т.е. явно руками написать определения функций, хотя это должен сделать компилятор?
Да. Предполагается, что у вас код разбит на небольшие функции, и части алгоритма, специфичные для разных аргументов шаблона, можно вынести в отдельную функцию.
Цитата Сообщение от [progeR] Посмотреть сообщение
Тогда вопрос: а зачем нужны шаблоны?
Для обобщённого программирования. Например, для обобщённых контейнеров, которые есть в стандартной библиотеке и т.д.
0
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
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
:)
Эксперт С++
4773 / 3267 / 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
196 / 197 / 120
Регистрация: 27.05.2011
Сообщений: 545
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.05.2015, 13:18
Помогаю со студенческими работами здесь

Как заставить вызвать метод класса-родителя для объекта (полиморфизм)
класс BigFloat (длинные вещественные числа с учетом знака) наследуется от BigNum (целые...

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

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

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru