gpt4 book ai didi

C++ 转换运算符重载失败

转载 作者:行者123 更新时间:2023-12-01 14:43:05 24 4
gpt4 key购买 nike

我有代码来重载不同类型的转换运算符:

#include <string>
#include <iostream>

class MyClass {
int m_int;
double m_double;
std::string m_string;

public:
MyClass() : m_int{1}, m_double(1.2), m_string{"Test"} {};

// overload the conversion operator for std::string
operator std::string() {
return m_string;
}

// overload the conversion operator for all other types
template <typename T>
operator T() {
if (std::is_same<T, int>::value)
return m_int;
else
return m_double;
}
};

int main() {

MyClass o;

int i = o;
double d = o;
std::string s = o;

std::cout << i << " " << " " << d << " " << s << std::endl;
}

这工作正常。但是当我尝试做
std::string s;
s = o;

编译失败
error: use of overloaded operator '=' is ambiguous (with operand types 'std::string' (aka 'basic_string<char, char_traits<char>, allocator<char> >') and 'MyClass')

显然,编译器实例化了一个不同于 std::string() 的转换运算符。如果我删除模板部分,编译器将被迫使用 std::string() 转换运算符,它会再次工作。那么我错过了什么?

最佳答案

std::string类,可以使用 operator=()将字符(以及作为结果的整数)分配给 std::string .这意味着以下代码是可以接受的,因为 operator=(char)确实存在:

std::string s1;

s1 = '1'; // works fine
s1 = 24; // works fine

但是您不能使用字符(以及整数)复制构造字符串。
std::string s2  = '1'; // compilation fails
std::string s3 = 24; // compilation fails

因此,就您而言,当您使用复制构造时,没有歧义,因为 std::string不能使用 double 或 int 进行复制构造。但是对于 operator=这是不明确的,因为您可以将整数分配到字符串中,而编译器不知道要使用哪个转换运算符。换句话说,编译器可以为此使用您的字符串和 int 转换运算符。

关于C++ 转换运算符重载失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61204293/

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