【发布时间】:2020-06-26 11:40:38
【问题描述】:
我正在尝试访问 std::variant 中保存的类的方法。不幸的是,它抛出并出现以下错误:
class ’std::variant<A, int>’ has no member named ‘function’
代码:
class A {
private:
int number = 0;
public:
A() {};
void function(int i) {
number += i;
}
};
// ... main ...
std::variant<A,B> array[4][4];
array[0][0] = A(){};
array[0][0].function(3);
我尝试阅读文档,但我仍然不明白我应该如何或是否应该使用 std::get() 和 std::variants.index() 来访问上述方法。
经过阅读后,我尝试在循环中做这样的事情:
std::size_t t=array[i][j].index();
std::get<t>(array[i][j]).function();
它仍然没有工作。错误是:
note: candidate: template<class _Tp, class ... _Types> constexpr _Tp&& std::get(std::variant<_Types ...>&&)
constexpr inline _Tp&& get(variant<_Types...>&& __v)
template argument deduction/substitution failed:
【问题讨论】:
-
是的,你需要使用
std::get。 -
变体的活动类型是运行时属性,因此不能直接调用变体上的成员函数并期望将它们转发给活动成员,因为这种调用是编译时的事情。
-
在我看来,您正在尝试学习如何在没有helpful assistance from a good C++ textbook 的情况下使用变体,这应该有很多关于如何设置和访问变体成员的示例。这是我希望在每本 C++ 教科书中涵盖的基本变体用法。不幸的是,stackoverflow.com 并不是教科书的有效替代品。