You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 20:15:27