0

我有如下代码:

typedef std::set<std::string> set_of_strings; 
            set_of_strings s1, s2, result1; 
    some_func()
    {
            s1.insert("1-2"); 
            s1.insert("1-1"); 
            s1.insert("3-4"); 
            s2.insert("1-2"); 
            s2.insert("1-3"); 
            s2.insert("3-4"); 

            set_of_strings::iterator s1_begin = s1.begin(); 
            set_of_strings::iterator s1_end = s1.end(); 
            set_of_strings::iterator s2_begin = s2.begin(); 
            set_of_strings::iterator s2_end = s2.end(); 
            set_of_strings::iterator result_begin = result1.begin();
            td::insert_iterator<set_of_strings> result_inserter = std::inserter(result1, result_begin); 

            set_difference(s1_begin, s1_end,s2_begin, s2_end,result_inserter); //This is the problem line
}

我得到的编译错误是overloading ambiguity std::copy(.... 问题是set_difference返回像 return copy(first1,last1,result);

在此处查看 set_difference 的算法。

set_difference 返回如下:

copy(..)

如果是的std::copy话就不会有任何问题。

我尝试将我的声明放在如下块中:

{
using namespace std;
set_difference(s1_begin, s1_end,s2_begin, s2_end,result_inserter);
}

但这不起作用。我知道问题出在我们为自己的目的编写并在许多地方使用的复制功能上。我想在这里使用std::copy。有人可以帮忙吗?

4

1 回答 1

4

如果您编写了自己的复制函数,编译器可以在相同的范围内看到std::copy它并且它是一个可能的候选者,那么肯定会导致歧义。

没有可以设置让它使用的魔法标志std::copy,但我认为如果你将自己的副本放在命名空间中而不是using那个命名空间,编译器将无法找到它并回退到std::copy. 也就是说,我认为我无法理解您想要创建一个copy适用于集合迭代器的替代方案的情况,如果您编写了一个通用的,它可能不应该被称为副本,因为它会导致没有结束像这样的歧义错误。

于 2011-12-28T06:21:03.753 回答