为什么在传递列表中作为参数不明确?

时间:2014-10-10 23:24:15

标签: c++

如何解决此编译错误?编译日志说调用者和候选者是完全相同的,但是有超载和暧昧? 代码:

Ctrl.h
namespace CvRcgCtrllr {
    bool AssignPidsTo(const list<unsigned int> & pids, CvRcg & rcg);
    bool RemovePidsFrom(const list<unsigned int> & pids, CvRcg & rcg);
};

Ctrl.cpp
using namespace CvRcgCtrllr;
         30 bool AssignPidsTo(const list<unsigned int> & pids, Rcg & rcg)
         31 {     
         44     return true;
         45 }
         46
         47 bool RemovePidsFrom(const list<unsigned int> & pids, Rcg & rcg)
         48 {
         49     
         50     //Rcg default_rcg = GetNewRcg("default");
         51     //bool res = AssignPidsTo(pids, default_rcg);
         52     return res;
         53 }

<!-- -->

CvRcgCtrllr.cpp: In function ‘bool RemovePidsFrom(const std::list<unsigned int, std::allocator<unsigned int> >&, Rcg&)’:
CvRcgCtrllr.cpp:51: error: call of overloaded ‘AssignPidsTo(const std::list<unsigned int, std::allocator<unsigned int> >&, Rcg&)’ is ambiguous
CvRcgCtrllr.cpp:30: note: candidates are: bool AssignPidsTo(const std::list<unsigned int, std::allocator<unsigned int> >&, Rcg&)
CvRcgCtrllr.h:20: note:                 bool CvRcgCtrllr::AssignPidsTo(const std::list<unsigned int, std::allocator<unsigned int> >&, Rcg&)

2 个答案:

答案 0 :(得分:1)

替换

using namespace CvRcgCtrllr;

通过

namespace CvRcgCtrllr
{
    // Your code of the file
}

答案 1 :(得分:1)

您只能通过执行

来定义命名空间成员
using namespace CvRcgCtrllr;

然后指定没有范围解析运算符的成员。它不起作用,因为你认为它的工作原理。在您的代码中,您在CvRcgCtrllr中声明了一对函数,然后在 global 命名空间中另外定义了一对完全独立的函数。这是导致重载决策过程中出现歧义的原因。

为了在CvRcgCtrllr文件中的.cpp命名空间定义您的函数,您必须重新打开命名空间

namespace CvRcgCtrllr
{
  bool AssignPidsTo(const list<unsigned int> & pids, Rcg & rcg)
  {
    // Whatever
  }
}

或使用函数的限定名称

bool CvRcgCtrllr::AssignPidsTo(const list<unsigned int> & pids, Rcg & rcg)
{
  // Whatever
}

没有办法避免这个或那个。 using namespace CvRcgCtrllr;在这里不会帮到你。