gpt4 book ai didi

c++ - 为什么在这种情况下重载决议不明确?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:38:32 26 4
gpt4 key购买 nike

我编写这段代码是为了检查类类型是否有 begin功能。

struct foo //a simple type to check
{
int begin(){ return 0;}
};

struct Fallback
{
int begin(){ return 0;}
};

template<typename T>
struct HasfuncBegin : T,Fallback
{
typedef char one;
typedef int two;

template<typename X>
static one check(int (X::*)() = &HasfuncBegin<T>::begin);
template<typename X>
static two check(...);

enum :bool {yes = sizeof(check<T>())==1, no= !yes};
};

int main()
{
std::cout<< HasfuncBegin<foo>::yes;
return 0;
}

产生错误:

error: call of overloaded 'check()' is ambiguous
enum {yes = sizeof(check<T>())==1, no= !yes};
^
C:\XXX\main.cpp:24:16: note: candidate: static HasfuncBegin<T>::one HasfuncBegin<T>::check(int (X::*)()) [with X = foo; T = foo; HasfuncBegin<T>::one = char]
static one check(int (X::*)() = &HasfuncBegin<T>::begin);
^
C:\XXX\main.cpp:26:16: note: candidate: static HasfuncBegin<T>::two HasfuncBegin<T>::check(...) [with X = foo; T = foo; HasfuncBegin<T>::two = int]
static two check(...);


^

任何人都可以解释为什么调用不明确(即使首先检查带有签名的函数 one check(int (X::*)() = &HasfuncBegin<T>::begin); 使用默认参数)以及还有如何使我的代码工作

编辑:

所以这是最终的工作代码:

struct foo
{
int begin(){ return 0;}
};

struct Fallback
{
int begin(){ return 0;}
};

template<typename T, T ptr> struct dummy{};

template<typename T>
struct HasfuncBegin : T,Fallback
{
typedef char one;
typedef int two;


template<typename X>
static one check(dummy<int (X::*)(),&HasfuncBegin<X>::begin>*);
// even this won't work, so replace above statement with below commented one
// static one check(dummy<decltype(&HasfuncBegin<X>::begin),&HasfuncBegin<X>::begin>*);
template<typename X>
static two check(...);

enum {yes = sizeof(check<T>(0))==1, no= !yes};
};

最佳答案

产生歧义的原因是 check() 的两个(模板化)重载是 check<T>() 的有效匹配项.您可能认为一个比另一个更有效,但语言规则是它们同样有效。

可变参数函数 ( ... ) 匹配零个或多个参数(即 check<T>() )。具有默认值的单个参数的函数可以匹配 check<T>() .

因此有关歧义的消息。

您实际上并没有描述您尝试使用此代码实现的目标(特别是 enum 的初始化),但不知何故期待我们能够解决您想要做的事情。让它编译的明显方法是删除其中一个重载。

但是,除非您描述了您真正想要实现的目标,否则没有人可以为您提供建议。像这样的阅读网站不会赋予人们读心术的能力。

关于c++ - 为什么在这种情况下重载决议不明确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34471536/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com