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

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

28.05.2015, 11:27. Показов 913. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.05.2015, 11:27
Ответы с готовыми решениями:

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

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от [progeR] Посмотреть сообщение
Достаточно сравнить константы
А вот этого компилятор не делает, это к правильности кода, на этапе компиляции, не относится, компилятор другие вещи проверяет, в частности, правильность вызовов методов.
0
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
28.05.2015, 12:08  [ТС]
Хорошо, как сделать так, что если класс 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
Сделать спецификацию шаблона
0
202 / 200 / 65
Регистрация: 06.10.2013
Сообщений: 552
28.05.2015, 12:11
Объявите еще один шаблон, где явно пропишите типы:
C++
1
template<MainMenuGenerator::ElementTypes type, TreeWidget> ...
0
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
28.05.2015, 12:12  [ТС]
Т.е. явно руками написать определения функций, хотя это должен сделать компилятор? Тогда вопрос: а зачем нужны шаблоны?
0
196 / 197 / 120
Регистрация: 27.05.2011
Сообщений: 545
28.05.2015, 12:24
Цитата Сообщение от [progeR] Посмотреть сообщение
Т.е. явно руками написать определения функций, хотя это должен сделать компилятор?
Да. Предполагается, что у вас код разбит на небольшие функции, и части алгоритма, специфичные для разных аргументов шаблона, можно вынести в отдельную функцию.
Цитата Сообщение от [progeR] Посмотреть сообщение
Тогда вопрос: а зачем нужны шаблоны?
Для обобщённого программирования. Например, для обобщённых контейнеров, которые есть в стандартной библиотеке и т.д.
0
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
28.05.2015, 12:55  [ТС]
Ясно, печально. Видимо разработчикам всяких компиляторов и языков неимоверно тяжело устранить очевидные недостатки...

Добавлено через 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
Цитата Сообщение от 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
Цитата Сообщение от [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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.05.2015, 13:18
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru