Инициализация char[] структуры элементом массивом const char[][]

вроде конст чар передаётся в структуру для создания массива, но пишет ошибку. Так же менял мпссив на неконстантный двумерный массив чар. Подскажите пожалуйста что может быть не так.

const char strings[10][10]{"one","two","three"..."ten"};
struct struct_one{
    char val[20];
    double k;
};
void main(){
    struct_one s1("one", 2323.23);
    struct_one s2(strings[1], 234.3);
    // на этой строке error: array must be initialized with a braсe-enclosed initializer
    std::cout << strings[0] << std::endl;
    //хотя вывод элемента корректный
}

Ответы (1 шт):

Автор решения: NunOfIt

Массивы в C++ являются некопируемыми объектами, а вы по сути передаёте в констуктор массив const char[4] и пытаетесь его присвоить другому массиву, из-за этого и возникает ошибка. Тут без циклического копирования (ну или memcpy, что по сути одно и то же) не обойтись. Ну или используёте std::string вместо масиива char.

const char strings[10][10] { "one", "two", "three", "four", "five", "seven", "eight", "nine", "ten" };

struct struct_one{
    char val[20];
    double k;
    
    template<size_t S>
    struct_one(const char (&val)[S], double k): k(k) {
        for(int i = 0; i < S; ++i)
            this->val[i] = val[i];
    }
};

int main(){
    char str[] = "one";
    
    struct_one s0(str, 2323.23);
    struct_one s1("one", 2323.23);
    struct_one s2(strings[1], 234.3);
    
    std::cout << s0.val << '\n';
    std::cout << s1.val << '\n';
    std::cout << s2.val << '\n';
    std::cout << strings[0] << '\n';
    std::cout << strings[1] << '\n';
    return 0;
}
→ Ссылка