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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> код, работающий на gcc-4.5.2, отказывается работат, ь на gcc-4.6.1 
V
    Опции темы
boostcoder
Дата 27.10.2011, 02:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



всем привет.

следующий код, успешно используется с gcc-4.5.2 компилятором. но при попытке собрать проект на gcc-4.6.1 получаю странные(на мой взгляд) ошибки.
Код

#include <iostream>
#include <boost/tuple/tuple.hpp>

template<typename T>
struct tuple_accessor;

typedef boost::tuple<
   char,
   long,
   std::string,
   std::vector<int>
> test_tuple1;

enum class test_enum1 {
   e_field1,
   e_field2,
   e_field3,
   e_field4
};

template<>
struct tuple_accessor<test_tuple1> {
   template<test_enum1 E>
   static typename boost::tuples::element<E, test_tuple1>::type&
   get(test_tuple1& item) { return item.get<E>(); }
   template<test_enum1 E>
   static const typename boost::tuples::element<E, test_tuple1>::type&
   get(const test_tuple1& item) { return item.get<E>(); }
};

int main() {
   test_tuple1 t;
   tuple_accessor<test_tuple1>::get<test_enum1::e_field2>(t) = 33;
   tuple_accessor<test_tuple1>::get<test_enum1::e_field3>(t) = "44";

   std::cout
   << "t.long = " << tuple_accessor<test_tuple1>::get<test_enum1::e_field2>(t) << std::endl
   << "t.string = " << tuple_accessor<test_tuple1>::get<test_enum1::e_field3>(t) << std::endl;
}

http://liveworkspace.org/code/1b548db0e887...658beae8162e6f6
Цитата

source.cpp: In function 'int main()':
source.cpp:33:60: error: no matching function for call to 'tuple_accessor<boost::tuples::tuple<char, long int, std::basic_string<char>, std::vector<int> > >::get(test_tuple1&)'
source.cpp:33:60: note: candidates are:
source.cpp:25:25: note: template<test_enum1 E> static typename boost::tuples::element<E, boost::tuples::tuple<char, long int, std::basic_string<char>, std::vector<int> > >::type& tuple_accessor<boost::tuples::tuple<char, long int, std::basic_string<char>, std::vector<int> > >::get(test_tuple1&)
source.cpp:28:31: note: template<test_enum1 E> static const typename boost::tuples::element<E, boost::tuples::tuple<char, long int, std::basic_string<char>, std::vector<int> > >::type& tuple_accessor<boost::tuples::tuple<char, long int, std::basic_string<char>, std::vector<int> > >::get(const test_tuple1&)
source.cpp:34:60: error: no matching function for call to 'tuple_accessor<boost::tuples::tuple<char, long int, std::basic_string<char>, std::vector<int> > >::get(test_tuple1&)'
source.cpp:34:60: note: candidates are:
source.cpp:25:25: note: template<test_enum1 E> static typename boost::tuples::element<E, boost::tuples::tuple<char, long int, std::basic_string<char>, std::vector<int> > >::type& tuple_accessor<boost::tuples::tuple<char, long int, std::basic_string<char>, std::vector<int> > >::get(test_tuple1&)
source.cpp:28:31: note: template<test_enum1 E> static const typename boost::tuples::element<E, boost::tuples::tuple<char, long int, std::basic_string<char>, std::vector<int> > >::type& tuple_accessor<boost::tuples::tuple<char, long int, std::basic_string<char>, std::vector<int> > >::get(const test_tuple1&)
source.cpp:37:78: error: no matching function for call to 'tuple_accessor<boost::tuples::tuple<char, long int, std::basic_string<char>, std::vector<int> > >::get(test_tuple1&)'
source.cpp:37:78: note: candidates are:
source.cpp:25:25: note: template<test_enum1 E> static typename boost::tuples::element<E, boost::tuples::tuple<char, long int, std::basic_string<char>, std::vector<int> > >::type& tuple_accessor<boost::tuples::tuple<char, long int, std::basic_string<char>, std::vector<int> > >::get(test_tuple1&)
source.cpp:28:31: note: template<test_enum1 E> static const typename boost::tuples::element<E, boost::tuples::tuple<char, long int, std::basic_string<char>, std::vector<int> > >::type& tuple_accessor<boost::tuples::tuple<char, long int, std::basic_string<char>, std::vector<int> > >::get(const test_tuple1&)
source.cpp:38:80: error: no matching function for call to 'tuple_accessor<boost::tuples::tuple<char, long int, std::basic_string<char>, std::vector<int> > >::get(test_tuple1&)'
source.cpp:38:80: note: candidates are:
source.cpp:25:25: note: template<test_enum1 E> static typename boost::tuples::element<E, boost::tuples::tuple<char, long int, std::basic_string<char>, std::vector<int> > >::type& tuple_accessor<boost::tuples::tuple<char, long int, std::basic_string<char>, std::vector<int> > >::get(test_tuple1&)
source.cpp:28:31: note: template<test_enum1 E> static const typename boost::tuples::element<E, boost::tuples::tuple<char, long int, std::basic_string<char>, std::vector<int> > >::type& tuple_accessor<boost::tuples::tuple<char, long int, std::basic_string<char>, std::vector<int> > >::get(const test_tuple1&)

Build finished with errors


чего оно от меня кочет?
спасибо.

Это сообщение отредактировал(а) boostcoder - 27.10.2011, 02:34
PM WWW   Вверх
mes
Дата 27.10.2011, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(boostcoder @  27.10.2011,  01:33 Найти цитируемый пост)
чего оно от меня кочет?


чтоб узнать это, уберите все лишнее и проверьте получение типа :

Код

    boost::tuples::element<test_enum1::e_field1, test_tuple1>::type test;


   http://liveworkspace.org/code/ba6f8af47f76...1c7acc887ae2c58


ну а проблема в enum class..точнее в более строгих правилах конвертации для последнего..


Это сообщение отредактировал(а) mes - 27.10.2011, 08:49


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


pattern`щик
****


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

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



mes, как я понял, проблема в том, что шаблон boost::tuples::element<> работает с целыми?

в общем, решил при помощи static_cast.
http://liveworkspace.org/code/129dd80100e1...099e553a03de9a9

всем спасибо.

PM WWW   Вверх
mes
Дата 27.10.2011, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(boostcoder @  27.10.2011,  11:42 Найти цитируемый пост)
проблема в том, что шаблон boost::tuples::element<> работает с целыми?

 smile 
Цитата(boostcoder @  27.10.2011,  11:42 Найти цитируемый пост)
в общем, решил при помощи static_cast

на старых версиях работать не должно, так как  там static_cast возвращает не const_expr..




--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 27.10.2011, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(mes @  27.10.2011,  13:38 Найти цитируемый пост)
на старых версиях работать не должно, так как  там static_cast возвращает не const_expr..

а как сделать универсальное решение? нужно самому написать аналог boost::tuples::element<> ? или что?

Добавлено через 2 минуты и 40 секунд
а как это решить для старых версий компиляторов?
PM WWW   Вверх
boostcoder
Дата 27.10.2011, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



кстати, со стандартными енумами работает. но меня всегда раздражала необходимость заворачивать их в неймспейсы или структуры. так что, просьба не предлагать такое решение.

Это сообщение отредактировал(а) boostcoder - 27.10.2011, 16:12
PM WWW   Вверх
mes
Дата 27.10.2011, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(boostcoder @  27.10.2011,  15:08 Найти цитируемый пост)
кстати, 

ну так поэтому и было выделено 
Цитата(mes @  27.10.2011,  07:48 Найти цитируемый пост)
 в enum class.

 smile 



--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0598 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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