Баг bcc32 или лыжи не едут?
От: Аноним  
Дата: 14.05.10 11:22
Оценка:
Доброго времени суток!

Такой код:

#include <iostream>

using namespace std;

template <typename T, bool B> struct Base {
  typedef T type;
  //enum {Bool = B};   //(1) !!!!!!!!!
};


template <typename T> struct Bug : public Base<T, true>
{
  typedef typename Base<T, true>::type type;
  type member;
};

typedef Bug<int> bug;

// bug a;          //(2) !!!!!!!!!   

void test(bug::type value)
{
  cout << value << endl;
}

int main()
{
    bug a;
    a.member = 10;
    test(a.member);
    return 0;
}


Если раскомментить (1) — получаем
[BCC32 Error] E2293 ) expected
В то же время, если раскомментить и (2) — замечательно компилится
comeau компилит все варианты.
Это таки баг или мое непонимание ?
Re: Баг bcc32 или лыжи не едут?
От: Кодт Россия  
Дата: 14.05.10 12:00
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Это таки баг или мое непонимание ?

Конечно, баг. Только было бы интересно понять — что же именно срубает компилятора?

— анонимный энум? — попробуй enum BoolType { Bool = B };
— значение из параметра? — enum { Bool = 123 };
— расширение bool до числа? — enum { Bool = (int)B, Shmool = (B+1) };
даже не знаю, что ещё предложить.

— попробуй переставить местами enum { Bool=B }; typedef T type;
— попробуй написать typedef Bug<int> bug; typedef bug::type bugtype;
Перекуём баги на фичи!
Re: Баг bcc32 или лыжи не едут?
От: Dzirt2005  
Дата: 14.05.10 12:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Доброго времени суток!


[...]
А>Если раскомментить (1) — получаем
А>[BCC32 Error] E2293 ) expected
У меня при этом получается:

C:\0>bcc32 a.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
a.cpp:
Warning W8054 a.cpp 7: Style of function definition is now obsolete
Error E2293 a.cpp 7: ) expected
Error E2190 a.cpp 7: Unexpected }
Error E2141 a.cpp 21: Declaration syntax error
*** 3 errors in Compile ***


А>В то же время, если раскомментить и (2) — замечательно компилится


Тоже компилируется.

А>comeau компилит все варианты.

А>Это таки баг или мое непонимание ?

А если строчку (1) заменить на:

...
//  enum {Bool = B};   //(1) !!!!!!!!!
  enum {Bool = 1};   //(1) !!!!!!!!!
...


то будет компилироваться и без раскомментирования (2).
Re[2]: Баг bcc32 или лыжи не едут?
От: AlexanderTsuz Украина  
Дата: 14.05.10 13:04
Оценка:
Здравствуйте, Кодт, Вы писали:

К>- попробуй написать typedef Bug<int> bug; typedef bug::type bugtype;


Сенкс!
Так, конечно, работает.
В 2010 студии (embarcadero) глянул — то-же самое.
С ней идет как обычно dinkumware stl, в которой таких граблей есть немного
Это-ж, блин, сколько лишних typedef'ов на каждый чих писать-то придется...
Пожалуй, придется воздержаться от bcc, хорошо хоть не купили
Re[2]: Баг bcc32 или лыжи не едут?
От: AlexanderTsuz Украина  
Дата: 14.05.10 13:09
Оценка:
Здравствуйте, Dzirt2005, Вы писали:

D>А если строчку (1) заменить на:


D>
D>...
D>//  enum {Bool = B};   //(1) !!!!!!!!!
D>  enum {Bool = 1};   //(1) !!!!!!!!!
D>...
D>


D>то будет компилироваться и без раскомментирования (2).


Так-то оно компилится, беда в том, что подобные энумы внутрях stl
Re: Баг bcc32 или лыжи не едут?
От: rm822 Россия  
Дата: 14.05.10 20:52
Оценка:
лучше сразу бросьте это дело, борландовый компайлер это редкостное Г, а с шаблонами у него вообще полный ппц
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Баг bcc32 или лыжи не едут?
От: AlexanderTsuz Украина  
Дата: 15.05.10 05:35
Оценка:
Здравствуйте, rm822, Вы писали:

R>лучше сразу бросьте это дело, борландовый компайлер это редкостное Г, а с шаблонами у него вообще полный ппц


Это точно
Просто решил поглядеть на борланд в свете с++0x, мож исправились. Получилось вот что:
Падения компилера с internal compiler error на ровном месте — обычное дело.
Фичи среды типа автокомплита работают, похоже, в потоке gui, что приводит к фризам секунд на 20(!) в проекте из 10 файлов.
Из с++0x нету ни лямбд, ни auto
boost 1.39 вроде как в поставке идет, но это немного "не тот" boost , а допиленный и порезаный. Очень увлекательно глядеть доку по бусту, потом глядеть хидеры и думать, а как, собственно?
C вышеприведенным багом либо на любой тип заводить typedef, либо курить сорцы на предмет енумов.

В общем, фтопку эту радость. Как было рисовалкой гуи 10 лет назад, так и осталось.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.