Форум программистов, компьютерный форум CyberForum.ru

Массив как член класса - C++

Восстановить пароль Регистрация
 
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
15.05.2014, 22:04     Массив как член класса #1
Почему мне GCC выдаёт ошибку компиляции, что это zero-sized array ?

C++
1
2
3
struct Base {
    const char* d[]{"f", "f"};
};
Код
ISO C++ forbids zero-size array 'd' [-Wpedantic]
     const char* d[]{"f", "f"};
                             ^
../expert/main.cpp:230:29: error: too many initializers for 'const char* [0]'
Под конец дня башка кипит, не могу нормально рассуждать, чтобы самому узнать ошибку.

А так всё норм, почему???
C++
1
2
3
struct Base {
    const char* d[2]{"f", "f"};
};
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5947 / 5552 / 1784
Регистрация: 18.12.2011
Сообщений: 14,184
Завершенные тесты: 1
15.05.2014, 22:22     Массив как член класса #2
Массивы так иницализировать нельзя.
C++
1
2
3
4
5
struct Base
{
    char d[2][2];
    Base(){strcpy(d[0],"f");strcpy(d[1],"f");}
};
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
15.05.2014, 22:30  [ТС]     Массив как член класса #3
Цитата Сообщение от zss Посмотреть сообщение
Массивы так иницализировать нельзя.
Почему? Сколько себя помню, так можно было.
+
Цитата Сообщение от gromo Посмотреть сообщение
А так всё норм, почему???
C++
1
2
3
struct Base {
const char* d[2]{"f", "f"};
};
Добавлено через 1 минуту
да в конце концов
C++
1
2
3
4
5
int main()
{
    const char* array[]{"abc", "abc"};
    return 0;
}
Хавается без предупреждений и ошибок -std=c++1y -Wpedantic -Wextra
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.05.2014, 22:33     Массив как член класса #4
Цитата Сообщение от gromo Посмотреть сообщение
Сколько себя помню, так можно было.
Одно дело внутри функции, и совсем другое - внутри класса.
Инициализация нестатических неконстантных полей внутри класса разрешена только начиная с C++11.
По данной ошибке не очень понятно (надо в стандарте порыться), почему компилятор не может вывести размер. Но вот clang например пишет более четкое сообщение:
error: array bound cannot be deduced from an in-class initializer
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
15.05.2014, 22:42  [ТС]     Массив как член класса #5
Цитата Сообщение от Tulosba Посмотреть сообщение
Одно дело внутри функции, и совсем другое - внутри класса.
Инициализация нестатических неконстантных полей внутри класса разрешена только начиная с C++11.
Ну да, "сколько себя помню" я относил уже к С++11
Цитата Сообщение от Tulosba Посмотреть сообщение
По данной ошибке не очень понятно (надо в стандарте порыться), почему компилятор не может вывести размер.
да уж не понятно почему, ведь инициализация членов внутри декларации класса просто неявно подставляется в список инициализации каждого конструктора, и не ясно что такого в инициализации константного массива...
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.05.2014, 23:24     Массив как член класса #6
Вот на sof есть подобный вопрос, правда без однозначного ответа.

Если массив сделать статическим членом класса, то прокатывает:
C++
1
2
3
struct Base {
    static constexpr const char* d[] = {"f", "f"};
};
http://ideone.com/ek8Cor
Видимо проблема кроется в том, что на момент когда должен быть известен размер класса до списка инициализации еще дело не дошло.
Yandex
Объявления
15.05.2014, 23:24     Массив как член класса
Ответ Создать тему
Опции темы

Текущее время: 07:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru