Вот что я пытаюсь MinGW g ++ 4.7.0.
#include <iostream>
#include <string>
class Fruit
{
public:
enum Value { APPLE, ORANGE, BANANA, NONE };
static const Value VALUES[4] = { APPLE, ORANGE, BANANA, NONE };
Fruit (Value v = NONE) : v_(v) { };
std::string to_string () const {
switch (v_) {
case APPLE: return "apple";
case ORANGE: return "orange";
case BANANA: return "banana";
default: return "none";
}
}
private:
Value v_;
};
int main (int argc, char * argv[])
{
for (Fruit f : Fruit::VALUES)
std::cout << f.to_string() << std::endl;
return 0;
}
Я пытаюсь скомпилировать его и получить вывод ниже:
>g++ -std=c++0x test.cpp
test.cpp:9:66: error: 'constexpr' needed for in-class initialization of static d
ata member 'const Fruit::Value Fruit::VALUES [4]' of non-integral type [-fpermis
sive]>g++ -std=c++0x -fpermissive test.cpp
test.cpp:9:66: warning: 'constexpr' needed for in-class initialization of static
data member 'const Fruit::Value Fruit::VALUES [4]' of non-integral type [-fperm
issive]
cc1l4Xgi.o:test.cpp:(.text+0x1a): undefined reference to `Fruit::VALUES'
collect2.exe: error: ld returned 1 exit status
Должен ли C ++ 11 разрешать инициализацию статического константного массива в таком классе? Или это должно быть определено вне класса, как раньше C ++ 11?
test.cpp: 9: 66: ошибка: ‘constexpr’ необходим для инициализации в классе
статического члена dta ‘const Fruit :: Value Fruit :: VALUES [4]’ из
нецелый тип [-fpermisive]
Компилятор рассказал, чего не хватает:
class Fruit
{
public:
enum Value { APPLE, ORANGE, BANANA, NONE };
static constexpr Value VALUES[4] = { APPLE, ORANGE, BANANA, NONE };
// ^^^^^^^^^
...
};
cc1l4Xgi.o: test.cpp :(. text + 0x1a): неопределенная ссылка на
`Фрукты :: ЗНАЧЕНИЯ»
Чтобы сделать компоновщик счастливым, вы должны добавить эту строку где-нибудь в исходных файлах (не в заголовочном файле):
constexpr Fruit::Value Fruit::VALUES[4];
Других решений пока нет …