为什么重载函数不绑定到更具体的重载?

Why doesn't overloaded function bind to more specific overload?

本文关键字:重载 函数 绑定 为什么      更新时间:2023-10-16

考虑以下重载函数:

template <class T>
void foo(const T& v)
{
    std::cout << "Generic version" << std::endl;
}
void foo(std::pair<const void*, std::size_t> p)
{
    std::cout << "Pair version" << std::endl;
}

下面,我希望调用第二个重载(需要std::pair的重载):

int main()
{
    const void* buf = 0;
    std::size_t sz = 0;
    foo(std::make_pair(buf, sz));
}

但是,此代码实际上调用泛型版本。 为什么它不绑定到专门需要std::pair的重载? 这是编译器错误吗?我正在使用一个相当旧的编译器,GCC 4.1.2

  • 您需要将专用函数声明为模板
  • 您的专用参数类型也必须遵循模板参数(即是常量引用)。

尝试

template <>
void foo(const std::pair<const void*, std::size_t>& p)
{
    ...
}