struct item sandwich{"Sandwich", 3.00};
- это использование составного литерала , которое допустимо в C (стандарт C99), но еще не разрешено в C ++. Но поскольку большинство компиляторов C ++ компилируют код как на C, так и на C ++, некоторые решают разрешить такие структуры в C ++. Однако большинство не обходится без специальных аргументов командной строки.
Итак, чтобы это было законно и переносимо, вы должны написать конструктор для вашей структуры элементов. Это легко, хотя
struct item {
item(string const & name_, double price_) : name(name_), price(price_) {}
string name;
double price;
};
А теперь вы можете создавать новые предметы с помощью
item sandwich("Sandwich", 3.00);
приписка
Обратите внимание, что я бы использовал именованные инициализаторы в составных литералах, когда в одной структуре есть поля с различным значением, просто понять, что к чему, тогда.
struct item sandwich = {.name = "Sandwich", .price = 3.0};
Конечно, это не сработает и в C ++, но, по крайней мере, выглядит лучше.
P.P.S.
Оказывается, я не обращал достаточного внимания на C ++ 0x, и там он называется списки инициализаторов . Похоже, что вы не можете сделать это имя, хотя это позор.
Таким образом, вместо использования стандарта C99 в коде C ++ ваш компилятор Linux молча использовал экспериментальные стандарты C ++ 0x. Тем не менее, если вам нужен кроссплатформенный код, все же лучше держаться подальше от этих модных функций и использовать вместо этого простые старые конструкторы.