Нужно написать реализацию метода шаблонного класса 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;
}
Если вы хотите в шаблонном коде хотите включать или выключать ветки кода через ветвление времени компиляции (с включением/выключением проверки семантики), то вам нужен if constexpr, а не обычный if. Вам здесь никак не поможет обычный if (typeid(T) == typeid(char*)). В обычном if все ветки кода должны быть всегда корректны, независимо от того, заходит туда выполнение или нет.
Буквально это реализуется как
if constexpr(std::is_same<T, char *>::value)
Отдельно стоит добавить, что циклы с предусловием !feof - это практически всегда ошибка.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей