Visual Studio c++对重载函数的歧义调用
Visual Studio C++ ambigous call to overloaded function
编辑:我张贴了整个类(条纹一些错误无关的东西出来)
我创建了以下类:
class packet
{public:char * buffer;
int size;
int data;
packet();
packet(packet &text, int length=-1);
packet(char * text, int length=-1);
packet(int val);
packet(char c);
packet(double d);
packet(float f);
~packet();
packet & operator= (packet &text);
packet operator+ (packet &text);
packet & operator+= (packet &text);
packet & operator|= (packet &text);
bool operator== (packet &text);
bool operator*= (packet &text);
bool operator!= (packet &text);
operator char* () const;
operator int () const;
operator float () const;
char operator [] (int pos) const;
};
我这样使用这个类:
packet p = packet();
或
return packet();
和Visual Studio给了我这个错误:
test.cpp(162): error C2668: 'packet::packet' : ambiguous call to overloaded function
...packet.h(26): could be 'packet::packet(float)'
...packet.h(23): or 'packet::packet(int)'
...packet.h(22): or 'packet::packet(char *,int)'
有人知道我在这里做错了什么吗?为什么会有歧义?
PS:我认为这与底部的4个操作符有关,但我对重载这些操作符有点模糊…
解决方案:我通过将一些构造函数标记为显式来使其工作:
class packet
{public:char * buffer;
int size;
int data;
packet();
packet(packet &text, int length=-1);
explicit packet(char * text, int length=-1);
explicit packet(int val);
explicit packet(char c);
explicit packet(double d);
explicit packet(float f);
~packet();
packet & operator= (packet &text);
packet operator+ (packet &text);
packet & operator+= (packet &text);
packet & operator|= (packet &text);
bool operator== (packet &text);
bool operator*= (packet &text);
bool operator!= (packet &text);
operator char* () const;
operator int () const;
operator float () const;
char operator [] (int pos) const;
};
如果错误确实发生在您尝试将函数结果赋值给新变量的地方,问题可能是您的复制构造函数。您应该将packet&
放在const
中,以便它可以用于临时对象:
packet(const packet & text, int length=-1);
如果您的类可以隐式转换为int
, float
,....
由于这些问题,通常建议不要添加不必要的转换操作符,并将构造函数标记为explicit
,以避免意外的隐式转换。
相关文章:
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- std::bind 是否实现了 std::ref 和 std::cref 来消除函数调用的歧义?
- C++ 类的构造函数和函数调用运算符 () 重载之间的歧义
- 如何让编译器知道要调用函数的哪个重载以避免歧义?
- 函数调用歧义(用户定义的转换和 Derived2Base 指针转换)
- 函数调用带有指针、引用和常量引用参数的歧义
- 调用模板函数时出现歧义
- 解决C++构造函数和调用歧义
- 在隐式转换后的智能指针上删除函数调用中的歧义
- 为什么在这个函数调用中没有歧义
- 嵌套类中对运算符[]的调用存在歧义
- 推导函数调用时出现歧义问题
- C++方法调用和类型范围解析的歧义
- 调用函数的歧义.隐式转换
- Visual Studio c++对重载函数的歧义调用
- 多个操作符重载会导致歧义调用
- SFINAE没有避免歧义调用
- 当添加模板参数时,重载解析会产生歧义调用
- GCC声明友元函数是重载的,有歧义调用,clang编译
- 歧义调用(从char*到lambda与std::string的转换)