Проблема с boost.tuple и enum.
От: Went  
Дата: 14.04.08 22:02
Оценка:
Здравствуйте.
Столкнулся с одной очень гадкой проблемой, и не знаю как ее победить. Есть достаточно сложная структура, в которой используется тупл с одним параметром. Так вот когда этот параметр — enum, то вылетает ошибка вроде "EnumType undeclared identifier" и указывает в недра тупла (файл tuple_basic.hpp). В других случаях все работает нормально. Никто не сталкивался с такой проблемой?
Re: Проблема с boost.tuple и enum.
От: Went  
Дата: 15.04.08 21:25
Оценка:
Здравствуйте.

Немного прояснилось. Видимо, какая-то проблема с компилятором (VC++ 7.1). Ему не нравятся энумы, определенные в неймспейсах. Если энум в корневом неймспейсе, или заюзан в нем, все проходит нормально. При чем, это косается только энумов, со структурами, например, все нормально...
Re[2]: Проблема с boost.tuple и enum.
От: Кодт Россия  
Дата: 16.04.08 11:50
Оценка:
Здравствуйте, Went, Вы писали:

W>Немного прояснилось. Видимо, какая-то проблема с компилятором (VC++ 7.1). Ему не нравятся энумы, определенные в неймспейсах. Если энум в корневом неймспейсе, или заюзан в нем, все проходит нормально. При чем, это косается только энумов, со структурами, например, все нормально...


Вот для примера,
#include <boost/tuple/tuple.hpp>

enum X { X0 = 1 };

namespace N { typedef enum { Y0 = 1 } Y; }

struct foo
{
    boost::tuple<X> tx;
    boost::tuple<N::Y> ty;
};

int main()
{
    foo f;
    f.tx = boost::make_tuple(X0);
    f.ty = boost::make_tuple(N::Y0);
    foo g = f;
    f = g;
    return f.tx.get<0>() == f.ty.get<0>();
}

Будет здесь ругаться? Или на чём-то ещё? Покажи, пожалуйста, код, чтоб знать врага в лицо.

У меня VC2005sp1, boost 1.35 — полёт нормальный.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[3]: Проблема с boost.tuple и enum.
От: Went  
Дата: 16.04.08 14:32
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Будет здесь ругаться? Или на чём-то ещё? Покажи, пожалуйста, код, чтоб знать врага в лицо.


Вылетает ошибка:

c:\ASHES\Source\boost\tuple\detail\tuple_basic.hpp(432): error C2065: 'Y' : undeclared identifier
c:\ASHES\Source\boost\tuple\detail\tuple_basic.hpp(432): error C2064: term does not evaluate to a function taking 0 arguments


На строчку в бусте:
  //  cons() : head(detail::default_arg<HT>::f()) {}
  cons() : head() {} //Файл tuple_basic.hpp, строка 432


Компилятор VC7.1 sp1.

Лечение: в корневом неймспейсе пишем:
  using N::Y;


Отакой
Re[4]: Проблема с boost.tuple и enum.
От: Кодт Россия  
Дата: 16.04.08 15:52
Оценка:
Здравствуйте, Went, Вы писали:

W>Вылетает ошибка:

W>

W>c:\ASHES\Source\boost\tuple\detail\tuple_basic.hpp(432): error C2065: 'Y' : undeclared identifier
W>c:\ASHES\Source\boost\tuple\detail\tuple_basic.hpp(432): error C2064: term does not evaluate to a function taking 0 arguments


W>На строчку в бусте:

W>
W>  //  cons() : head(detail::default_arg<HT>::f()) {}
W>  cons() : head() {} //Файл tuple_basic.hpp, строка 432
W>


W>Компилятор VC7.1 sp1.


Да, значит, это компилятор злой.
А если минимализировать до вот такого?
namespace bust
{
    template<class T> struct cons0
    {
        T head;
        cons0() : head() {}
    };
    
    namespace detail
    {
        template<class T> struct mpl_const
        {
            typedef T type;
        };
    }
    
    template<class T> struct cons1
    {
        typename detail::mpl_const<T>::type head;
        cons1() : head() {}
    };
}

namespace N { enum Y { Y1 = 1 }; }

bust::cons0<N::Y> c0;
bust::cons1<N::Y> c1;

Просто интересно, на какой степени удалённости компилятор перестаёт видеть имя.
(VC8 полёт нормальный).
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[5]: Проблема с boost.tuple и enum.
От: Went  
Дата: 18.04.08 11:50
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Просто интересно, на какой степени удалённости компилятор перестаёт видеть имя.

К>(VC8 полёт нормальный).

namespace bust
{
  template<class T> struct cons0
  {
    T head;
    cons0() : head() {}
  };
}

namespace N { enum Y { Y1 = 1 }; }

bust::cons0<N::Y> c0;


Этого достаточно, чтобы 7.1 облажался
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.