实现相等的算法

时间:2013-11-04 18:25:37

标签: c++ algorithm

我所要做的就是实现相同的算法。但是,当我用几个字符串进行测试时,会出现歧义错误。我认为编译器无法区分A和B.为什么会这样?

template <class A, class B> bool equal(A beg, A end, B out)
{
    while(beg != end) {
        if(*beg == *out) {
            ++beg;
            ++out;
        }
        else return false;
    }
    return true;
}

MAIN

std::string a("This is a string");
std::string b("This is a string");
std::string c("String c");
std::cout << "a and b are " << equal(a.begin(), a.end(), b.begin()) << std::endl;
std::cout << "a and c are " << equal(a.begin(), a.end(), c.begin()) << std::endl;

ERROR MESSAGE

procedures_main.cpp:17:35: error: call to 'equal' is ambiguous
    std::cout << "a and b is " << equal(a.begin(), a.end(), b.begin()) << std::endl;
                                  ^~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/algorithm:1105:1: note: 
      candidate function [with _InputIterator1 = std::__1::__wrap_iter<char *>, _InputIterator2 =
      std::__1::__wrap_iter<char *>]
equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2)
^
./procedures.hpp:73:34: note: candidate function [with A = std::__1::__wrap_iter<char *>, B = std::__1::__wrap_iter<char
      *>]
template <class A, class B> bool equal(A beg, A end, B out)

2 个答案:

答案 0 :(得分:2)

问题是参数(来自std::string的迭代器)位于命名空间std中,并且在此命名空间中,还有另一种称为equal的算法,由于参数的原因,它是一个候选者从属查找(ADL)。您需要明确限定算法:

std::cout << "a and b are " << ::equal(a.begin(), a.end(), b.begin()) << std::endl;
//                             ^^ here

请注意,C ++标准不要求迭代器是std中的类型,但允许它,并且编译器/标准库决定使用此选项。

答案 1 :(得分:1)

这是所谓的Argument-Dependent Name Lookup的结果。在C ++中有标准算法std :: equal。编译器看到函数调用的参数属于namespace std。因此,它还会考虑名称空间std中名称相同的任何函数。结果它找到两个函数:一个由你定义,另一个在namespace std中声明。 要转义错误,请使用:: equal的函数的完全限定名称。 顺便说一下,你错误地使用你的函数,这样的用法有不确定的行为。第二个范围必须至少与第一个范围相同。在你的例子中,你使用字符串a和c,c的大小小于a的大小。