VS环境下C++获取未知类型用户输入报错求助(E0304、LNK2019、LNK1120)
解决你的C++模板函数错误:E0304、LNK2019和LNK1120
嘿,作为C++新手碰到这些错误太正常了,我来帮你拆解一下问题所在,以及怎么修复:
错误原因分析
E0304:模板参数推导失败
你调用auto data = dataEntered();的时候,编译器完全不知道template <typename T>里的T应该是什么类型。auto是靠右边的表达式类型来推导的,但右边的模板函数本身需要先确定T才能生成具体的函数——这就陷入了死循环,编译器没法凭空猜你要输入什么类型。LNK2019/LNK1120:未解析的外部符号
因为编译器没法推导T,所以根本没有实例化dataEntered<T>这个模板函数的具体版本。链接器找不到对应的函数实现,自然就报链接错误了。
修复方案:显式指定模板参数
最简单的修复方式是在调用模板函数时,明确告诉编译器T的类型。比如你想读取整数,就写成dataEntered<int>(),读取浮点数就用dataEntered<double>(),字符串就用dataEntered<std::string>()。
修正后的完整代码:
#include "stdafx.h" #include <iostream> #include <string> // 如果要处理字符串需要加这个头文件 template <typename T> T dataEntered() { T data; std::cout << "Enter Data: " << std::endl; std::cin >> data; return data; } int main() { // 显式指定模板参数,这里以int为例,你可以换成其他类型 auto data = dataEntered<int>(); std::cout << "You entered: " << data << std::endl; std::cout << "Size of data: " << sizeof(data) << std::endl; // 试试其他类型的例子 auto floatData = dataEntered<double>(); std::cout << "You entered a double: " << floatData << ", size: " << sizeof(floatData) << std::endl; auto strData = dataEntered<std::string>(); std::cout << "You entered a string: " << strData << ", size: " << sizeof(strData) << std::endl; return 0; }
进阶:让用户选择输入类型
如果你想让程序支持多种类型输入,可以先让用户选择类型,再根据选择实例化对应的模板函数:
#include "stdafx.h" #include <iostream> #include <string> template <typename T> T dataEntered() { T data; std::cout << "Enter Data: " << std::endl; std::cin >> data; return data; } int main() { std::cout << "Pick a data type to enter:\n1. Integer\n2. Decimal\n3. String\nYour choice: "; int choice; std::cin >> choice; switch(choice) { case 1: { auto intData = dataEntered<int>(); std::cout << "Integer entered: " << intData << " (size: " << sizeof(intData) << " bytes)" << std::endl; break; } case 2: { auto doubleData = dataEntered<double>(); std::cout << "Decimal entered: " << doubleData << " (size: " << sizeof(doubleData) << " bytes)" << std::endl; break; } case 3: { auto strData = dataEntered<std::string>(); std::cout << "String entered: " << strData << " (size: " << sizeof(strData) << " bytes)" << std::endl; break; } default: std::cout << "Invalid choice!" << std::endl; } return 0; }
关键知识点提醒
C++是静态类型语言,所有变量的类型都必须在编译时确定。模板函数的T也是编译时确定的,没法在运行时根据用户输入动态改变类型。所以必须提前告诉编译器要实例化哪个版本的模板函数。
内容的提问来源于stack exchange,提问作者Adnan Turan
相关产品推荐
相关产品推荐

