Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> непонятная ошибка с шаблонной функцией 
V
    Опции темы
victor79
Дата 23.7.2013, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 15.5.2008

Репутация: нет
Всего: нет



компилятор mingw 4.6.2 выдает ошибку:
contr.cpp: In member function 'void t_control::exclude_from_owner()':
contr.cpp:68:74: error: no matching function for call to 'list_item_exclude(t_control*&, t_control* const)'
contr.cpp:68:74: note: candidate is:
item_excl.h:10:4: note: template<class T, class fn> T* list_item_exclude(T*&, T*)

есть функция:
Код

template <class T, class fn>
T* list_item_exclude(T*& last, T* item) {
     if (last == item) {
         last = &(*fn::prev(item));
     } else {
         T *p = NULL, *it = last;
         for (; it; it = fn::prev(it)) {
             if (it == item) break;
             p = it;
         }
         if (it == NULL || it != item) err("list_item_exclude: not found");
         fn::prev(p) = &(*fn::prev(item));
     }
     fn::prev(item) = NULL;
     return item;
}

и есть ее вызов:
Код

    struct t_prev {
       static t_control*& prev(t_control* c) { return c->prev_control; };
    };
    list_item_exclude<t_control,t_prev>(owner_control->last_control, this); // this не const


в чем проблема?

PM MAIL WWW   Вверх
akizelokro
Дата 23.7.2013, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Я не особо спец, но кажись struct t_prev не является объектом типа "t_control* const"

Код

contr.cpp:68:74: error: no matching function for call to 'list_item_exclude(t_control*&, t_control* const)'


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
victor79
Дата 23.7.2013, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 15.5.2008

Репутация: нет
Всего: нет



вы не про то говорите.
там this является t_control, а t_prev используется только для ссылки на свойство t_control::prev_control.
там какая-то ирунда с объявление шаблона или с вызовом. Он в ошибке какую-то непонятную конст приписывает:
contr.cpp:68:74: error: no matching function for call to 'list_item_exclude(t_control*&, t_control* const)'
PM MAIL WWW   Вверх
akizelokro
Дата 23.7.2013, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Ну, сделайте шаблон для const. или приведение типа. Там и определите, может  this и является const

Это сообщение отредактировал(а) akizelokro - 23.7.2013, 19:54


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
volatile
Дата 24.7.2013, 00:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(victor79 @  23.7.2013,  19:09 Найти цитируемый пост)
contr.cpp:68:74: error: no matching function for call to 'list_item_exclude(t_control*&, t_control* const)'

Здесь не указатель на константный объект, а само значение указателя константа.

Вы явно что-то не договариваете...


Это сообщение отредактировал(а) volatile - 24.7.2013, 00:08
PM MAIL   Вверх
victor79
Дата 24.7.2013, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 15.5.2008

Репутация: нет
Всего: нет



в итоге переделал на макрос:
Код

#define LIST_EXCL(T,PROPPREV,LAST,ITEM)       {\
    struct T##PROPPREV {                           \
    static void make(T*& last, T* item) {      \
        if (last == item) {                    \
            last = item->PROPPREV;             \
        } else {                               \
            T *p = NULL, *it = last;           \
            for (; it; it = it->PROPPREV) {    \
                if (it == item) break;         \
                p = it;                        \
            }                                  \
            if (it == NULL || it != item)      \
                err("list_item_exclude: not found");\
            p->PROPPREV = item->PROPPREV;      \
        }                                      \
        item->PROPPREV = NULL;                 \
    }};                                        \
    T##PROPPREV::make(LAST,ITEM);                 }

а вызов получается:
Код

    LIST_EXCL(t_control, prev_control, owner_control->last_control, this);

описание функции то же, но компилит нормально. Значит глюк в компиляции шаблонов.
PM MAIL WWW   Вверх
borisbn
Дата 30.7.2013, 11:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Судя по всему это
Цитата(victor79 @  23.7.2013,  19:09 Найти цитируемый пост)
// this не const

не так.

http://codepad.org/tXzO9hF9


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
victor79
Дата 31.7.2013, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 15.5.2008

Репутация: нет
Всего: нет



не так, но не совсем не так. Я проверил Ваш вариант - да компилится. В моем случае структура t_prev была локальной в функции. Т.е. проблема в сообщении об ошибке - было какое-то сообщение, когда в шаблон передается локальный класс. И в моем варианте должно было быть сообщение, но другое. А он выдал какое-то совершено левое сообщение. Т.е. глюк в том, что за сообщение выдается.
PM MAIL WWW   Вверх
xvr
Дата 6.8.2013, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(victor79 @  31.7.2013,  16:00 Найти цитируемый пост)
Т.е. глюк в том, что за сообщение выдается.

Главная ошибка любого компилятора в том, что он компилирует то, что програмист написал, а не то, о чем програмист думал  smile Текст метода, гда ваш list_item_exclude<t_control,t_prev>(owner_control->last_control, this); стоит покажите   smile 


PM MAIL   Вверх
borisbn
Дата 6.8.2013, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(victor79 @  31.7.2013,  16:00 Найти цитируемый пост)
 В моем случае структура t_prev была локальной в функции. 

Подтверждаю. Если перенести определение struct t_prev внутрь функции, которая вызывает list_item_exclude, то ошибка присутствует. Причём именно та, о которой говорил ТС.
Цитата
 error: no matching function for call to 'list_item_exclude(t_control*&, t_control* const)'

Пруф
Если вынести определение struct t_prev наружу, то всё компилится (см. моё предыдущее сообщение)


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0709 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.