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

C++ 重载quick_sort传递给std::function报unresolved overloaded function错误

问题描述

有趣的发现:如果移除私有的quick_sort()函数,程序就可以正常运行。

Stackoverflow 提示我因代码行数过多需要补充更多细节。我认为私有重载函数在某种程度上混淆了编译器,导致它不知道该选择哪个quick_sort()版本。

代码文件 main.cpp

#include <functional>
#include <ctime>
#include <vector>
#include <iostream>

template<template<class> class T, class V>
class Sorter {
public:
    static void quick_sort(T<V>* seq, std::function<int (V, V)> comp);
    static clock_t sort_time(std::function<void(T<V>*, std::function<int(V, V)>)> sort, T<V>* seq, std::function<int(V, V)> comp);
private:
    // 该函数是重载的私有成员,用于递归逻辑
    static void quick_sort(T<V>* seq, std::function<int (V, V)> comp, int start, int end);
};

template<template<class> class T, class V>
void Sorter<T, V>::quick_sort(T<V>* seq, std::function<int (V, V)> comp) {
    quick_sort(seq, comp, 0, seq->vec.size() - 1);
}

template<template<class> class T, class V>
void Sorter<T, V>::quick_sort(T<V>* seq, std::function<int (V, V)> comp, int start, int end) {
    // ...
}
template<template<class> class T, class V>
clock_t Sorter<T, V>::sort_time(std::function<void (T<V>*, std::function<int (V, V)>)> sort, T<V>* seq, std::function<int (V, V)> comp) {
    // ...
    return clock();
}

int comp(int num1, int num2) {
    // ...
    return 0;
}

template<class T>
class Sequence {
public:
    std::vector<T> vec;
    Sequence(){};
};

int main()
{
    Sequence<int> seq;
    seq.vec = {2, 6, 3, 8};
    
    // 这里也存在问题
    // std::function<void(Sequence<int>*, std::function<int(int, int)>)> sort = Sorter<Sequence, int>::quick_sort;
    std::cout << "Sort time: " << Sorter<Sequence, int>::sort_time(Sorter<Sequence, int>::quick_sort, &seq, comp);

    return 0;
}

报错信息

<source>:47:67: error: cannot convert '<unresolved overloaded function type>' to 'std::function<void(Sequence<int>*, std::function<int(int, int)>)>'
   47 |     std::cout << "Sort time: " << Sorter<Sequence, int>::sort_time(Sorter<Sequence, int>::quick_sort, &seq, comp);
      |                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>: In function 'int main()':
<source>:46:101: error: conversion from '<unresolved overloaded function type>' to non-scalar type 'std::function<void(Sequence<int>*, std::function<int(int, int)>)>' requested
   46 |     std::function<void(Sequence<int>*, std::function<int(int, int)>)> sort = Sorter<Sequence, int>::quick_sort;
      |                                                                                                     ^~~~~~~~~~
<source>:47:67: error: cannot convert '<unresolved overloaded function type>' to 'std::function<void(Sequence<int>*, std::function<int(int, int)>)>'
   47 |     std::cout << "Sort time: " << Sorter<Sequence, int>::sort_time(Sorter<Sequence, int>::quick_sort, &seq, comp);
      |                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:23:88: note:   initializing argument 1 of 'static clock_t Sorter<T, V>::sort_time(std::function<void(T<V>*, std::function<int(V, V)>)>, T<V>*, std::function<int(V, V)>) [with T = Sequence; V = int; clock_t = long int]'
   23 | clock_t Sorter<T, V>::sort_time(std::function<void (T<V>*, std::function<int (V, V)>)> sort, T<V>* seq, std::function<int (V, V)> comp) {
      |                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~

问题原因

错误核心是重载函数地址解析规则导致的:
编译器在处理函数名取地址、需要匹配到std::function类型时,会先将所有同名重载函数纳入候选集,这个阶段不会先判断函数的访问权限(公有/私有)。所以哪怕4参数的quick_sort是私有、在main中不可访问,编译器还是会把它和2参数的公有版本放在一起比较,无法自动判定你要取哪个版本的地址,就抛出了「未决议的重载函数类型」错误。
当你删除私有重载后,候选集只剩唯一一个2参数版本,编译器可以直接匹配到std::function的签名,自然就编译通过了。

解决方法

方法1:显式强转函数地址类型

手动指定要取的重载版本的函数指针类型,强制编译器匹配:

// 替换main中的调用行即可
std::cout << "Sort time: " << Sorter<Sequence, int>::sort_time(
    static_cast<void(*)(Sequence<int>*, std::function<int(int, int)>)>(&Sorter<Sequence, int>::quick_sort),
    &seq, comp);

方法2:用Lambda包裹调用(更推荐)

不需要手写复杂的类型签名,Lambda内部的函数调用会自动匹配到正确的公有重载版本:

std::cout << "Sort time: " << Sorter<Sequence, int>::sort_time(
    [](Sequence<int>* seq, std::function<int(int, int)> comp) {
        Sorter<Sequence, int>::quick_sort(seq, comp);
    },
    &seq, comp);

内容的提问来源于stack exchange,提问作者OwlCodR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:36:04