我有以下类:
class StackStringHolder
{
public:
StackStringHolder& operator=(const std::string& str)
{
str_ = str;
return *this;
}
StackStringHolder& operator=(std::string&& str)
{
str_ = std::move(str);
return *this;
}
const std::string& get() const { return str_; }
private:
std::string str_;
};
我想以以下方式在std::variant
中使用它:
int main() {
std::variant<int, StackStringHolder> var;
var = 5;
std::string str = "Hello";
var = str; // error
var = std::move(str); // error
}
然而编译器(MSVS2022(说:
错误C2679:二进制'=':找不到占用右手的运算符类型为"std::string"的操作数(或者没有可接受的转换(
Update,我确信我的代码已经足够了,但正如我所要求的,这里有一个完整的例子:
#include <string>
#include <variant>
class StackStringHolder
{
public:
StackStringHolder& operator=(const std::string& str)
{
str_ = str;
return *this;
}
StackStringHolder& operator=(std::string&& str)
{
str_ = std::move(str);
return *this;
}
const std::string& get() const { return str_; }
private:
std::string str_;
};
int main() {
std::variant<int, StackStringHolder> var;
var = 5;
std::string str = "Hello";
var = str; // error
var = std::move(str); // error
return 0;
}
问题原因:
您的var
可以容纳int
或StackStringHolder
,因此您不能简单地将其分配给std::string
。
解决方案:
但是,您可以将转换构造函数添加到接受std::string
的类StackStringHolder
中
然后可以将str
转换为StackStringHolder
,并将其分配给var
。
您的转换构造函数应该看起来像:
StackStringHolder(std::string const& str)
: str_(str) {}
现在您可以使用:
var = str;
var = std::move(str);