В вашей функции main
компилятор должен скомпилировать весь ваш код. Даже если он оптимизирует его позже, потому что он может видеть dataType == 1
, стандарт c ++ говорит, что он должен сначала сгенерировать код для всех типов данных.
Вы можете исправить это, используя if constexpr
, чтобы компилятор компилирует только тот код, который фактически используется:
int main(){
const int dataType = 1;
if constexpr (dataType == 1) {
Menu <std::string> c(dataType);
c.run();
}else if (dataType == 2) {
Menu <int> c(dataType);
c.run();
}else if (dataType == 3) {
Menu<double> c(dataType);
c.run();
}else if (dataType == 4) {
Menu<char> c(dataType);
c.run();
}
return 0;
}
Похоже, что это не совсем то, что вам нужно. Правильное решение - исправить строку, вызывающую сбой:
List< T >* list1 = new List< T >("Test");
Это действительно только тогда, когда T
равно std::string
. Если вы замените его чем-то более общим c, ваш код будет скомпилирован. Вы можете использовать сконструированное значение по умолчанию:
List< T >* list1 = new List< T >(T{});
Или, что более вероятно, ваше назначение требует, чтобы вы прочитали значение из консоли:
T value;
while (!(std::cin >> value))
{
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "invalid value\n";
}
List< T >* list1 = new List< T >(value);