没有调用更具体的过载

时间:2013-08-08 18:16:29

标签: c++

鉴于以下两个函数,如果我将std::pair<const char*, std::size_t>传递给它,我会期望调用第一个重载,因为它比泛型T更具体。

void foo(const std::pair<const char*, std::size_t>& p)
{
    std::cout << "pair" << std::endl;
}

template <class T>
void foo(const T& v)
{
    std::cout << "generic" << std::endl;
}

int main()
{
    const char* s = "abc";
    foo(std::make_pair(s, std::size_t(3)));
}

但是,该程序输出:

generic

为什么调用第二个重载,而不是显式占用pair的重载?

这是编译器问题吗?我现在碰巧使用了一个非常古老的编译器(GCC 4.1.2)。

嗯......这可能是一个编译器问题:

http://ideone.com/97XwwZ

3 个答案:

答案 0 :(得分:9)

您的编译器肯定是错误的。它是什么错误,只会是猜测,但你是正确的,这个代码应该提供更具体的输出。样本不够大或不够复杂,无法使任何更微妙的规则成为原因。

答案 1 :(得分:4)

这似乎只是一个编译器问题。我使用的是旧编译器(GCC 4.1.2)。使用较不古老的编译器似乎会导致正确的重载被称为

http://ideone.com/97XwwZ

#include <iostream>
#include <utility>

void foo(const std::pair<const char*, std::size_t>& p)
{
    std::cout << "pair" << std::endl;
}

template <class T>
void foo(const T& v)
{
    std::cout << "generic" << std::endl;
}

int main()
{
    const char* s = "abc";
    foo(std::make_pair(s, std::size_t(3)));
}

答案 2 :(得分:0)

根据重载分辨率,它应该更喜欢您的示例中的特定分辨率。

我会说这是由于旧版本而导致的编译器错误。使用GCC 4.8.1编译时。它输出

pair

根据此链接:overloading resolution demo