Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2015, 12:09   #1
progerer
 
Регистрация: 28.05.2015
Сообщений: 3
По умолчанию Не работает шаблон

Есть код:
Код:
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) и на этом успокоится?

Как сделать, чтобы если класс T - это TreeWidget, то выполнять код:
Код:
qDebug() << parent->size();
а если T - это какой-то другой класс, то код:
Код:
qDebug() <<parent->text(Title);
?
progerer вне форума Ответить с цитированием
Старый 28.05.2015, 12:56   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
почему тогда он просматривает все ветки if-else и пишет ошибку, мол метод text() не определен для объекта класса TreeWidget,
Потому что это обычный if

Цитата:
если должен был посмотреть только равенство в операторе if (которое выполняется, т.к. 0 = 0) и на этом успокоится?
Не должен, абсолютно

Цитата:
Как сделать, чтобы если класс T - это TreeWidget, то выполнять код:
Частичная специализация или крутить енабл_иф, кондишинал и подобные
p51x вне форума Ответить с цитированием
Старый 28.05.2015, 13:15   #3
progerer
 
Регистрация: 28.05.2015
Сообщений: 3
По умолчанию

Хм, вот ведь вопрос: а что мешает его сделать хоть немного статическим? Иль это непосильная задача?
progerer вне форума Ответить с цитированием
Старый 28.05.2015, 13:34   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Сделайте в каждом классе (ну, или в базовом классе) метод getMenuString.
Для каких-то классов он будет вызывать getText(), для каких-то - getSize().

Если сделать это виртуальным методом, тогда не понадобится шаблон.
В любом случае не потребуется ElementType, который кстати мог бы быть static const в самом классе и получаться через T, например T::type.
waleri вне форума Ответить с цитированием
Старый 28.05.2015, 16:31   #5
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Копать нужно в таком направлении:
Код:
#include <type_traits>
#include <iostream>

class S1
{
public:
    void f(int) {std::cout << "S1\n";}
};

class S2
{
public:
    void f(int, int) {std::cout << "S2\n";}
};

template <typename _T, typename _Void = void>
struct Is_break;

template <typename _T>
struct Is_break <_T, typename std::enable_if<std::is_same<_T, S1>::value>::type>
{
    static void f(_T &t, int i1, int)
    {
        t.f(i1);
    }
};

template <typename _T>
struct Is_break <_T, typename std::enable_if<std::is_same<_T, S2>::value>::type>
{
    static void f(_T &t, int i1, int i2)
    {
        t.f(i1, i2);
    }
};

int main(int i, char *args[])
{
    S1 s1;
    S2 s2;
    if(i > 1)
        if(*args[1] == '0')
            Is_break<decltype(s1)>::f(s1, 1, 2);
        else
            Is_break<decltype(s2)>::f(s2, 1, 2);
}
g++ -std=C++11 t.cpp
./a.out 0
S1
./a.out 1
S2
220Volt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не работает шаблон *.xlt в Officce2010 irinasela Microsoft Office Excel 4 28.05.2014 16:08
Шаблон в С++ 25LioN52 Помощь студентам 2 14.12.2011 23:18
CSS шаблон не работает на сайте Kate96 HTML и CSS 6 29.11.2011 16:37
Дано: таблица в Exel (3 столбца, 4000 строк) и шаблон документа. Задача: Распечатать один и тот-же шаблон документа, под Evgenya040305 Помощь студентам 2 24.11.2011 22:21
почему у меня шаблон не работает? the_deer_one C# (си шарп) 6 16.05.2011 23:15