Непонятное поведение программы

251
02 мая 2018, 05:13

Нужно написать реализацию метода шаблонного класса List для простых типов данных и строк(сhar*), которая будет загружать список с csv файла. Написал, но её поведение непонятно. (Программа падает на этапе компиляции). *Допустим мы создаем список для типа double. Вызываем эту функцию и получаем ошибку в node.data = new char[strlen(str) + 1];, мол невозможно преобразование, хотя оно в эту ветку даже не должно зайти

bool List<T>::load(const char *filename) {
FILE*csv;
if ((csv = fopen(filename, "rt")) != NULL) {
    char str[128];
    fseek(csv, 0, SEEK_END);
    long size = ftell(csv);    //size of txt file
    size = size - sizeof(char*);  //our lenght of file
    fseek(csv, 0, SEEK_SET);
    if (typeid(T) == typeid(char*)) {
        while (!feof(csv) && ftell(csv) <= size) {
            node_type node;
            fscanf(csv, "%[A-z.0-9];", &str);
            node.data = new char[strlen(str) + 1];
            strcpy(node.data, str);
            this->push_front(node);
        }
    }else {
    while (!feof(csv) && ftell(csv) <= size) {
        fscanf(csv, "%[A-z.0-9];", &str);
        this->push_front(*new node_type((T)(atof(str))));
    }
}
    fclose(csv);
    return true;
}
return false;

}

Answer 1

Если вы хотите в шаблонном коде хотите включать или выключать ветки кода через ветвление времени компиляции (с включением/выключением проверки семантики), то вам нужен if constexpr, а не обычный if. Вам здесь никак не поможет обычный if (typeid(T) == typeid(char*)). В обычном if все ветки кода должны быть всегда корректны, независимо от того, заходит туда выполнение или нет.

Буквально это реализуется как

if constexpr(std::is_same<T, char *>::value)

Отдельно стоит добавить, что циклы с предусловием !feof - это практически всегда ошибка.

READ ALSO
Асинхронная запись в файл WinApi

Асинхронная запись в файл WinApi

Есть программа поиска всех файлов каталоге С

269
Реализация алгоритма CN2

Реализация алгоритма CN2

Есть ли у кого-нибудь реализация данного алгоритма на языках C/C++/Java? Ну, или хотя бы псевдокод с описанием? Буду рад любой помощи

249
Как получить и обработать строку в функции модуля Python?

Как получить и обработать строку в функции модуля Python?

Нужно писать модуль для python на c++Хочу передать из пайтона в функцию строковый аргумент, как-то изменить ее, например добавив "!", и вернуть обратно...

229
Напишите программу на C++ или C [требует правки]

Напишите программу на C++ или C [требует правки]

Напишите программу, которая считывает произвольное количество чисел до стоп-слова "STOP" и выводит, сколько раз среди них встречается первое...

246