Странная ошибка компоновщика со статическим массивом int - PullRequest
0 голосов
/ 20 августа 2011

Я пытался скомпилировать следующий код с помощью Clang 3.0.Не удается связать, я делаю что-то не так или это ошибка компилятора?

Ошибка следует

Неопределенные символы для архитектуры x86_64:
"__ZN9int_arrayIJLi0ELi1ELi2ELi3ELi4ELi5ELi6ELiEEELELEELEELEELEELEELEELEELEELEELEELиз: __ZN9int_arrayIJLi0ELi1ELi2ELi3ELi4ELi5ELi6ELi7ELi8EEE5printEv в cc-JDTbNl.o ld: символ (ы) не найден для архитектуры x86_64

Код следует

* 1011

Ответы [ 2 ]

2 голосов
/ 04 сентября 2011

Ваш код неверен по двум причинам

  • Вы не можете инициализировать статический элемент данных в классе, если он не имеет целочисленный тип или тип перечисления и не constexpr
  • Вы пропустили определение для int_array<yournumbers>::list. Поскольку вы используете этот член в odr, вам необходимо определить его.

Это не лягушатник. Как только clang получит поддержку constexpr, а затем вы добавите определение класса out (который не может иметь инициализатора), как вы уже предоставили один в классе) и замените const на constexpr, код должен работать нормально ,


Для широкой публики, вот PR, который @James отправил Clang .

1 голос
/ 20 августа 2011

Я совсем не эксперт по c ++ 0x и надеюсь, что сюда придет кто-нибудь более знающий ... но допускает ли C ++ 0x инициализацию в классе статических членов? Если так, то Clang просто еще не реализовал это. Если нет, вы не можете. (почти) стандартный , пункт 9.4.2, говорит, что любой константный литеральный тип может быть инициализирован; и 3.9 пункт 10 говорит, что массив int является литералом. Итак, я думаю, что это ошибка в clang 3.0, но в случае шаблонов с переменными параметрами могут быть и другие правила ...

В любом случае, изменение вашего кода для меня работало следующим образом:

template<int... Numbers>
struct int_array {
  int x;
  const static int list[];
  static void print() ;
};

template<int... Numbers>
const int int_array<Numbers...>::list[]={Numbers...};

template<int... Numbers>
void int_array<Numbers...>::print(){
    for (const int x : list) {
        std::cout << x <<std::endl;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...