解决Microsoft Visual Studio Community中模板函数引发的未解析外部符号错误
问题:Visual Studio编译报错“未解析的外部符号main”
已尝试修复程序错误,但程序仅在部分编译器中正常运行,在Microsoft Visual Studio中无法运行,报错信息如下:
未解析的外部符号main,该符号在函数"int __cdecl invoke_main(void) (?invoke_main@@YAHXZ)"中被引用
原代码
#include <iostream> using namespace std; #define E '\n' #define ll long long template<typename T> class BinarySearch { public: BinarySearch(T target, T elements[]) :elements(elements), target(target) { } bool solve(int start_index, int end_index) { int mid_index = (start_index + end_index) / 2; if (start_index >= end_index) { if (elements[start_index] == target) return true; else return false; } else { if (elements[mid_index] == target) return true; else if (elements[mid_index] < target) return solve(mid_index + 1, end_index); else return solve(start_index, mid_index - 1); } } private: T* elements; T target; }; template<typename T> int main() { int elements[] = { 1,2,3,47,111,121,681,990 }; int target = 0; BinarySearch solution(target, elements); cout << solution.solve(0, 7); return 0; }
错误原因
C++标准明确要求,程序的入口函数main不能是模板函数。你给main添加了template<typename T>声明,属于违规写法。部分编译器可能对该行为做了兼容,但Visual Studio严格遵循标准,因此会报错找不到合法的main入口。
另外,创建BinarySearch对象时没有指定模板参数类型,编译器无法自动推导类模板的类型,这也是一个潜在问题。
修复后的代码
#include <iostream> using namespace std; #define E '\n' #define ll long long template<typename T> class BinarySearch { public: BinarySearch(T target, T elements[]) :elements(elements), target(target) { } bool solve(int start_index, int end_index) { int mid_index = (start_index + end_index) / 2; if (start_index >= end_index) { if (elements[start_index] == target) return true; else return false; } else { if (elements[mid_index] == target) return true; else if (elements[mid_index] < target) return solve(mid_index + 1, end_index); else return solve(start_index, mid_index - 1); } } private: T* elements; T target; }; // 移除main函数的模板声明 int main() { int elements[] = { 1,2,3,47,111,121,681,990 }; int target = 0; // 明确指定BinarySearch的模板参数类型为int BinarySearch<int> solution(target, elements); cout << solution.solve(0, 7); return 0; }
内容的提问来源于stack exchange,提问作者Ali_np_dp
相关产品推荐
相关产品推荐

