这里是我的代码:变:没有匹配函数调用“得到”
#include <iostream>
#include <variant>
#include <vector>
class A {
public:
virtual void Foo() = 0;
};
class B : public A {
public:
void Foo() override {
std::cout << "B::Foo()" << std::endl;
}
};
class C :public A {
public:
void Foo() override {
std::cout << "C::Foo()" << std::endl;
}
};
template<typename... Args>
class D {
public:
template<typename T>
void Foo() {
m_variant = T{};
}
void Bar() {
std::get<m_variant.index()>(m_variant).Foo();
}
private:
std::variant<std::monostate, Args...> m_variant;
};
int main() {
D<B, C> d;
d.Foo<B>();
d.Bar();
d.Foo<C>();
d.Bar();
}
(c.f wandbox.org)
,我发现了错误no matching function for call to 'get'
但我不明白为什么。 std::variant::index()
是constexpr,所以它不是问题(我通过直接测试值1
,但仍然是相同的错误)。
我有一个std::monostate
防止空变种(当无参数是typename... Args
)
'm_variant.index()'是一个运行时的值,使用访问者,而不是('的std ::访问([] (auto&e){e.Foo();},m_variant);')。 – Jarod42
尽管''index'](http://en.cppreference.com/w/cpp/utility/variant/index)函数被标记为“constexpr”,变量'm_variant'是* not *并且可以因此不能在编译时使用。 –
只有当变量对象被调用是一个常量表达式时,'std :: variant :: index()'的结果才是一个常量表达式。你的不是。 – StoryTeller