C ++为什么调用不明确?

时间:2014-11-11 18:18:43

标签: c++

class myClass {
   int arr[100];
public:
    void *get(long i, void* const to) const;
    void *get(long i, bool nog);
    void *tstfn(void* const to) { return get(0L,to); }
};

gcc -Wall说:

dt.cpp: In member function ‘void* myClass::tstfn(void*)’:
dt.cpp:6:49: warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second: [enabled by default]
dt.cpp:4:9: note: candidate 1: void* myClass::get(long int, void*) const
dt.cpp:5:9: note: candidate 2: void* myClass::get(long int, bool)

3 个答案:

答案 0 :(得分:27)

两个函数调用都需要进行类型转换:

  • 调用void*函数需要向const
  • 添加this个限定符
  • 调用bool函数需要将tovoid*转换为bool

因此,根据重载决策规则,两者都不是更好的"匹配比另一个,并且电话被认为是模糊的。

也许您可以将const添加到第二个函数中;也许你可以从第一个中删除它(虽然我不喜欢);也许您可以对thisto进行显式类型转换,以强制首选覆盖。

答案 1 :(得分:13)

因为void *get(long i, void* const to)const

这意味着从tstfn(非const)调用它需要thismyClass*const myClass*的资格转换,因此调用这两个函数都需要参数的转换(this的处理方式与其他参数相同),因此调用不明确。

答案 2 :(得分:6)

只是因为你的testfn是一个非const函数,它会调用非get的const版本。非const函数getbool而非const void*。如果只有一个get函数(可能将void*作为第二个参数,而不管它的常量),那么就会毫无歧义地调用它。