Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何解决参数中默认构造函数导致的函数重载不明确问题_C++_Gcc_G++ - Fatal编程技术网

C++ 如何解决参数中默认构造函数导致的函数重载不明确问题

C++ 如何解决参数中默认构造函数导致的函数重载不明确问题,c++,gcc,g++,C++,Gcc,G++,假设我有一门课: class Foo { public: void member(std::string s); void member(int64_t &n); }; 现在我想做一些事情,比如 int64_t value = 5; Foo f; f.member(value); 问题是编译器(至少是GCC)感到困惑&认为我试图使用char*构造函数用字符串调用成员: invalid conversion from 'int64_t' to 'const char* 删除

假设我有一门课:

class Foo {
public:
   void member(std::string s);
   void member(int64_t &n);
};
现在我想做一些事情,比如

int64_t value = 5;
Foo f;
f.member(value);
问题是编译器(至少是GCC)感到困惑&认为我试图使用char*构造函数用字符串调用成员:

invalid conversion from 'int64_t' to 'const char*
删除by ref解决了此问题。

强制转换参数,使其与所需重载的参数类型完全匹配:

f.member((int64_t) value);

强制转换参数以完全匹配所需重载的参数类型:

f.member((int64_t) value);

可能有更简单的方法来解决这个问题(比如使用参数转换),但我看到的解决方案如下所示:

void (Foo::*memberProc)(int64_t) = &Foo::member;

Foo f;
((f).*(memberProc))(5);

是的,很复杂,但它是明确的。

可能有更简单的方法来解决这个问题(比如使用参数转换),但我看到的解决方案如下所示:

void (Foo::*memberProc)(int64_t) = &Foo::member;

Foo f;
((f).*(memberProc))(5);

是的,很复杂,但很明确。

抱歉-发现了错误

宣言是:

class Foo {
public:
    void member(std::string s);
    void member(int64_t &n);
};
class Foo {
public:
   void member(std::string s);
   void member(int64_t &n);
};

删除by ref解决了此问题。

抱歉-发现错误

宣言是:

class Foo {
public:
    void member(std::string s);
    void member(int64_t &n);
};
class Foo {
public:
   void member(std::string s);
   void member(int64_t &n);
};


删除by ref解决了这个问题。

我无法用Ubuntu上的GCC 3.3、4.2或4.4以及Solaris 10上的GCC 3.4重现这个错误。你是对的——出于某种原因,我尝试简化为一个简单的案例失败了。这是我实际代码中的一个编译器错误-可能我错过了其他东西。现在更改为
int64\u t&
,我不再理解它为什么会编译失败。我无法在Ubuntu上用GCC 3.3、4.2或4.4重现错误,也无法在Solaris 10上用GCC 3.4重现错误。你是对的,因为某些原因,我试图简化成一个简单的案例,但失败了。这是我的实际代码中的一个编译器错误-可能我遗漏了其他内容。现在更改为
int64\u t&
后,我再也不明白它为什么会编译失败。如果您已经传递了正确类型的变量,这是多余的。这不起作用,因为他有一个非常量引用参数,虽然。@unknown:但他没有通过正确的类型。参数应为int64,说明中的输入错误为uint64。这应该是int64\t。如果您已经传递了一个类型正确的变量,那么这是多余的。这不起作用,因为他有一个非常量引用参数。@unknown:但他传递的类型不正确。参数应为int64,说明中的输入错误为uint64。那应该是int64\t。你更改了你说不想做的方法签名。。。我想是的。我在考虑更多关于更改函数名的问题。我仍然不清楚为什么编译器会变得混乱(只在我的代码中-我试图将代码简化为一个示例失败)。您更改了您说不想做的方法签名。。。我想是的。我在考虑更多关于更改函数名的问题。我仍然不清楚为什么编译器会变得混乱(只是在我的代码中——我试图将代码简化为一个示例失败)。丑陋。我宁愿割腕也不愿用这种方法。丑。我宁愿割腕也不愿用这种方法。