【问题标题】:How to store value in std::variant when using a class as a datatype?使用类作为数据类型时如何在 std::variant 中存储值?
【发布时间】:2020-10-16 20:53:40
【问题描述】:

我创建了一个类并将该类用作 std::variant 的数据类型。但是当我存储值时,我无法访问它,因为它显示了一些错误。

#include <variant>
#include <string>
#include <iostream>

class Random
{
    public:
        int rand_number;
        float rand_dec;
};

int main(){
    Random random;
    random.rand_number=1;
    random.rand_dec=2.1;
    
    std::variant<Random,std::string> input{ "Hello" };
    
    auto PrintVisitor = [](const auto& t) { std::cout << t << "\n"; };
    std::visit(PrintVisitor, input);}

所以,我想知道在使用类时如何访问值,因为使用默认数据类型时没有问题?

错误太大,所以我发布了重要部分

 19 52  C:\Users\Khusi\Documents\CPP\test2.cpp  [Error] no match for 'operator<<' (operand types are 'std::ostream' {aka 'std::basic_ostream<char>'} and 'const Random')

【问题讨论】:

  • 请发布确切的错误及其发生位置。不用猜测会容易得多。
  • 如错误所示,您尚未为Random 定义operator&lt;&lt; 重载。
  • @0x5453 你能告诉我怎么做吗?我对此很陌生,我不知道该怎么做。
  • @SHIVANSHUSAHOO This 问题有一些例子。
  • @0x5453 谢谢..

标签: c++ variant


【解决方案1】:

访问您的变量input 时,它只接受两种类型:您的类Randomstd::string,函数PrintVisitor 对变量的每个成员执行一个操作:std::cout &lt;&lt; t &lt;&lt; "\n";。所以类 std::string 有一个重载输出运算符,但你的类没有。你需要实现它。

这是一个重载输出运算符的示例:https://docs.microsoft.com/en-us/cpp/standard-library/overloading-the-output-operator-for-your-own-classes?view=vs-2019

【讨论】:

  • 感谢您的帮助
猜你喜欢
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 2019-05-13
  • 1970-01-01
  • 2015-07-09
相关资源
最近更新 更多