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)
答案 0 :(得分:27)
两个函数调用都需要进行类型转换:
void*
函数需要向const
this
个限定符
bool
函数需要将to
从void*
转换为bool
。因此,根据重载决策规则,两者都不是更好的"匹配比另一个,并且电话被认为是模糊的。
也许您可以将const
添加到第二个函数中;也许你可以从第一个中删除它(虽然我不喜欢);也许您可以对this
或to
进行显式类型转换,以强制首选覆盖。
答案 1 :(得分:13)
因为void *get(long i, void* const to)
是const
。
这意味着从tstfn
(非const)调用它需要this
从myClass*
到const myClass*
的资格转换,因此调用这两个函数都需要参数的转换(this
的处理方式与其他参数相同),因此调用不明确。
答案 2 :(得分:6)
只是因为你的testfn
是一个非const函数,它会调用非get
的const版本。非const函数get
取bool
而非const void*
。如果只有一个get
函数(可能将void*
作为第二个参数,而不管它的常量),那么就会毫无歧义地调用它。