GCC vs. CL
От: ssi Россия  
Дата: 08.11.02 19:00
Оценка:
Почему CL не компилирует следующий код (вроде все законно):

struct ab {
   ab(int _a, int _b) : a(_a), b(_b) {}
   int a, b;
};
     
template<class T, int n> struct foo { T data[n]; };

int main() { 
   foo<ab, 2> theFoo = { ab(1, 2), ab(1, 2) };
   return 0; 
}


error C2552: 'theFoo' : non-aggregates cannot be initialized with initializer list

Если у ab убрать конструкор и написать

   foo<ab, 2> theFoo = { 1, 2, 1, 2 };


все компилируется. Причем, GCC совершенно спокойно компилирует и тот и другой вариант.
Помогите пожалуйста разобраться.
Знающие не говорят, говорящие не знают. Лао Цзы
Re: GCC vs. CL
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 08.11.02 20:09
Оценка:
Здравствуйте ssi, Вы писали:

>Если у ab убрать конструкор и написать

ssi>   foo<ab, 2> theFoo = { 1, 2, 1, 2 };

ssi>все компилируется.

Вот что написано по сему вопросу в стандарте (8.5.1):

An aggregate is an array or a class (clause 9) with no user-declared constructors (12.1), no private or protected nonstatic data members (clause 11), no base classes (clause 10), and no virtual functions (10.3).
...
When an aggregate is initialized the initializer can be an initializer-clause
consisting of a braceenclosed, comma-separated list of initializers for the members of the aggregate, written in increasing subscript or member order. If the aggregate contains subaggregates, this rule applies recursively to the members of the subaggregate.


Таким образом, мы видим, что ab не является агрегатом, и соответственно, все правильно. Ну а когда убираем конструктор, то все становится на свои места, и такая запись проходит.
Алексей Кирдин
Re[2]: GCC vs. CL
От: ssi Россия  
Дата: 08.11.02 22:26
Оценка:
Здравствуйте Kaa, Вы писали:

Kaa>Вот что написано по сему вопросу в стандарте (8.5.1):

Kaa>

Kaa>An aggregate is an array or a class (clause 9) with no user-declared constructors (12.1), no private or protected nonstatic data members (clause 11), no base classes (clause 10), and no virtual functions (10.3).
Kaa>...
Kaa>When an aggregate is initialized the initializer can be an initializer-clause
Kaa>consisting of a braceenclosed, comma-separated list of initializers for the members of the aggregate, written in increasing subscript or member order. If the aggregate contains subaggregates, this rule applies recursively to the members of the subaggregate.


Kaa>Таким образом, мы видим, что ab не является агрегатом, и соответственно, все правильно. Ну а когда убираем конструктор, то все становится на свои места, и такая запись проходит.


Да, действительно, ab не является агрегатом (стандарт я читал), но какое это имеет отношение к приведенному случаю, initializers for the members of the aggregate могут быть чем угодно, в том числе, естественно, и не агрегатами.
Знающие не говорят, говорящие не знают. Лао Цзы
Re: GCC vs. CL
От: Павел Кузнецов  
Дата: 09.11.02 08:27
Оценка:
Здравствуйте ssi, Вы писали:

ssi>Почему CL не компилирует следующий код (вроде все законно):


Потому что CL содержит ошибку.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: GCC vs. CL
От: Андрей Тарасевич Беларусь  
Дата: 09.11.02 08:58
Оценка:
Здравствуйте Kaa, Вы писали:

Kaa>Здравствуйте ssi, Вы писали:


>>Если у ab убрать конструкор и написать

Kaa>
ssi>>   foo<ab, 2> theFoo = { 1, 2, 1, 2 };
Kaa>

ssi>>все компилируется.

Kaa>Вот что написано по сему вопросу в стандарте (8.5.1):

Kaa>

Kaa>An aggregate is an array or a class (clause 9) with no user-declared constructors (12.1), no private or protected nonstatic data members (clause 11), no base classes (clause 10), and no virtual functions (10.3).
Kaa>...
Kaa>When an aggregate is initialized the initializer can be an initializer-clause
Kaa>consisting of a braceenclosed, comma-separated list of initializers for the members of the aggregate, written in increasing subscript or member order. If the aggregate contains subaggregates, this rule applies recursively to the members of the subaggregate.


Kaa>Таким образом, мы видим, что ab не является агрегатом, и соответственно, все правильно. Ну а когда убираем конструктор, то все становится на свои места, и такая запись проходит.


'ab' действительно не является агрегатом. Но к данному вопросу это отношения не имеет. Агрегатным инициализатором в данном примере инициализируется 'foo<ab, 2>', а не 'ab'. А 'foo<ab, 2>' агрегатом является. Как и, например, 'ab[2]'. Ложное сообшение об ошибке вызвано ошибкой в самом MS-овском компиляторе.
Best regards,
Андрей Тарасевич
Re[3]: GCC vs. CL
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 09.11.02 09:21
Оценка:
Здравствуйте Андрей Тарасевич, Вы писали:

АТ>'ab' действительно не является агрегатом. Но к данному вопросу это отношения не имеет.


Я вчера весь вечер думал, как бы мне это сообщение снести побыстврей, чтоб его никто не увидел. Согласен.
Алексей Кирдин
Re[2]: GCC vs. CL
От: ssi Россия  
Дата: 09.11.02 10:21
Оценка:
Здравствуйте Павел Кузнецов, Вы писали:

ssi>>Почему CL не компилирует следующий код (вроде все законно):


ПК>Потому что CL содержит ошибку.


Как же жить дальше, я так привык к CL, перейти на GCC немогу, так как SGI STL не поддерживает
<iostream>, а у меня все проги его юзают (ИМЕННО <iostream> БЕЗ .h).
Знающие не говорят, говорящие не знают. Лао Цзы
Re[3]: GCC vs. CL
От: Павел Кузнецов  
Дата: 09.11.02 10:48
Оценка:
Здравствуйте ssi, Вы писали:

ssi>>>Почему CL не компилирует следующий код (вроде все законно):


ПК>>Потому что CL содержит ошибку.


ssi>Как же жить дальше, я так привык к CL,


Ну, если уж инициализация агрегатов такя проблема...

ssi>перейти на GCC немогу, так как SGI STL не поддерживает <iostream>, а у меня все проги его юзают (ИМЕННО <iostream> БЕЗ .h).


Почему не поддерживает? Используй новый gcc (например, mingw 3.2) или STLport.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[4]: GCC vs. CL
От: ssi Россия  
Дата: 09.11.02 10:54
Оценка:
Здравствуйте Павел Кузнецов, Вы писали:

ПК>Ну, если уж инициализация агрегатов такя проблема...


я просто хочу использовать boost::array
Знающие не говорят, говорящие не знают. Лао Цзы
Re[5]: GCC vs. CL
От: Юнусов Булат Россия  
Дата: 09.11.02 13:54
Оценка:
Здравствуйте ssi, Вы писали:

ssi>я просто хочу использовать boost::array


Так cl же с ним нормально обращается
Re[6]: GCC vs. CL
От: ssi Россия  
Дата: 09.11.02 14:28
Оценка:
Здравствуйте Юнусов Булат, Вы писали:

ssi>>я просто хочу использовать boost::array


ЮБ>Так cl же с ним нормально обращается


У меня cl 12.00.8804, и как было описано выше, выдает ошибку, если в качестве элемента агрегата boost::array взять объект класса (структуры, объединения), содержащего конструктор.
У Вас либо какой-то супер-пупер cl, либо вы просто использовали объекты, класс которых не содержит конструктора (напр. стандартные типы данных).
Знающие не говорят, говорящие не знают. Лао Цзы
Re[7]: GCC vs. CL
От: Юнусов Булат Россия  
Дата: 09.11.02 15:56
Оценка:
Здравствуйте ssi, Вы писали:

ssi> У Вас либо какой-то супер-пупер cl, либо вы просто использовали объекты, класс которых не содержит конструктора (напр. стандартные типы данных).


Угу, я был неправ.
Re[4]: GCC vs. CL
От: ssi Россия  
Дата: 18.11.02 16:37
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ssi>>перейти на GCC немогу, так как SGI STL не поддерживает <iostream>, а у меня все проги его юзают (ИМЕННО <iostream> БЕЗ .h).


ПК>Почему не поддерживает? Используй новый gcc (например, mingw 3.2) или STLport.


Спасибо за дельный совет!
Скачал STLport, использую. Перешол на GCC ради boost'а.

Появились глупые вопросы по компилятору:
1. хочу подключить некий заголовочный файл во все компилируемые файлы "проекта", используя опцию GCC -include, почему этот заголовочный файл не ищется по путям инклюдников (опция -I)?
приходиться указывать полный путь, что неудобно;
2. тоже касательно библиотеки user32.lib (например), хочу ее подлинковать к "проекту", однако она не ищется в путях библиотек (опция -L), так ее имя не в формате lib*.a?
Знающие не говорят, говорящие не знают. Лао Цзы
Re[5]: GCC vs. CL
От: ssi Россия  
Дата: 21.11.02 16:22
Оценка:
Очень жаль, что никто не может мне помочь. Помоему, вопросы не очень сложные для знающего человека.
Знающие не говорят, говорящие не знают. Лао Цзы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.