C++:用户定义的显式类型转换函数错误
C++ : user defined Explicit type conversion function error
以下是代码的外观:
using namespace std;
class dummy{
public:
int x;
explicit dummy(int x = 0) : x{ this->x = x } {}; //explicit has no effect here
};
class myClass {
public:
operator int(); //<---problematic conversion
explicit operator dummy();
};
myClass::operator int() {
return 10;
}
myClass::operator dummy(){
return dummy(9);
}
int main() {
myClass mc1;
dummy val = (dummy)mc1;
cout << "mc1 int cast: " << mc1 << endl;
cout << "val.x: :" << val.x << endl;
std::cin.get();
return 0;
}
我在这里使用 ms vs 编译器并得到 c2440(类型转换错误(。据我了解,我在语法上没有做错任何事。这里的问题是,如果我从代码中删除隐式转换:operator int()
及其各自的函数,它可以正常工作。 即:
using namespace std;
class dummy{
public:
int x;
explicit dummy(int x = 0) : x{ this->x = x } {}; //explicit has no effect here
};
class myClass {
public:
//operator int();
explicit operator dummy();
};
/*
myClass::operator int() {
return 10;
}*/
myClass::operator dummy(){
return dummy(9);
}
int main() {
myClass mc1;
dummy val = (dummy)mc1;
//cout << "mc1 int cast: " << mc1 << endl;
cout << "val.x: " << val.x << endl;
std::cin.get();
return 0;
}
这将产生以下输出(如预期(:
val.x: 9
编辑:第二个示例中缺少显式关键字。输出相同
在 ubuntu 9 上使用 gcc-18.04 编译您的原始代码 我得到这个:
test.cpp:27:24: error: call of overloaded ‘dummy(myClass&)’ is ambiguous
27 | dummy val = (dummy)mc1;
| ^~~
test.cpp:7:14: note: candidate: ‘dummy::dummy(int)’
7 | explicit dummy(int x = 0) : x{ this->x = x } {}; //explicit has no effect here
| ^~~~~
test.cpp:4:7: note: candidate: ‘constexpr dummy::dummy(const dummy&)’
4 | class dummy{
| ^~~~~
test.cpp:4:7: note: candidate: ‘constexpr dummy::dummy(dummy&&)’
正在发生的事情是编译器无法判断你是要从"myClass"的int转换中创建一个新的"虚拟"类,还是从隐式生成的"dummy"复制运算符中创建一个新的"虚拟"类。
这会导致一个循环,其中"myClass"可以转换为int
和dummy
这意味着编译器在尝试转换"myClass"时陷入困境,因为它不知道您实际上想要做什么 - 转换为"虚拟",转换为"虚拟"然后复制它,或者通过将"myClass"转换为int
来制作新的"虚拟"
解决方案是将转换运算符设置为intexplicit
这样可以防止编译器进行隐式转换并允许其工作(至少在gcc-9上(。
这是代码的更新副本,它将起作用:
using namespace std;
class dummy{
public:
int x;
explicit dummy(int x=0) : x(x) {}
};
class myClass {
public:
explicit operator int(); // < Set to explicit
explicit operator dummy();
};
myClass::operator int() {
return 10;
}
myClass::operator dummy(){
return dummy(9);
}
int main() {
myClass mc1;
dummy val = static_cast<dummy>(mc1);
cout << "mc1 int cast: " << static_cast<int>(mc1) << endl;
cout << "val.x: :" << val.x << endl;
std::cin.get();
return 0;
}
这使用 gcc-9 和 clang++-9 编译
作为旁注,请不要在C++中使用 C 样式的转换,它们容易出错并且调试起来很痛苦
dummy
类型的对象的方式之间存在歧义 创建。
第一个是调用operator dummy
创建类型为dummy
的临时对象,然后由于显式强制转换而调用复制构造函数。
第二个是当类型myClass
的对象由于operator int
而转换为类型int
,然后调用类myClass
的转换构造函数来创建类型为dummy
的对象。
下面是一个演示程序,它显示了使用显式强制转换创建类对象的两种方法。
#include <iostream>
struct A
{
explicit A( int x = 0 ) : x( x ) { std::cout << "A( " << x << " )n"; }
A( const A & ) { std::cout << "A( const A & )n"; }
int x;
};
int main()
{
A a( 1 );
std::cout << 'n';
( A )a;
std::cout << 'n';
( A )2;
return 0;
}
程序输出为
A( 1 )
A( const A & )
A( 2 )
相对于您的程序,在您的程序中,在使用这些方式之前还有一个额外的步骤:将类型myClass
的对象初步转换为dummy
类型或int
类型。
- C++:用户定义的显式类型转换函数错误
- 为什么转换函数声明不需要至少一个定义类型说明符
- C++无效的函数类型转换
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 通过构造函数方法输出的类到类类型转换是 5500 为什么不是 5555
- 如何在参数中定义隐式类型转换的构造函数?
- LINUX 操作系统上的错误:令牌之前预期的构造函数、析构函数或类型转换'('?
- 将内置类型变量传递给只有一个类类型参数的"+"运算符函数时自动类型转换的构造函数
- 从 cpp lib 调用函数时的数据类型转换
- 如何为具有常量类型的函数正确转换来自 DLsym 的返回值?
- 指向类成员函数的指针中存在类型转换错误
- C++ 函数重载不明确,没有自动类型转换
- 为什么用户定义的转换函数模板不能有推导的返回类型?
- 具有重载类型转换运算符的函数对象崩溃
- 将函数指针类型转换为相应的字符串
- 类型转换运算符重载与 as 非成员函数
- 错误 c++ 在令牌之前'('预期的构造函数、析构函数或类型转换
- 错误:在“(”标记之前进行预期的构造函数、析构函数或类型转换.即使我有一个构造函数
- 使用模板和部分专用化生成类型转换函数
- 重载 C++ 类型转换(函数)