Hier ist mein Code:Variante: keine passende Funktion für Aufruf von ‚get‘
#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)
Ich erhalte den Fehler no matching function for call to 'get'
aber ich herausfinden, nicht warum. std::variant::index()
ist conexpr, so ist es nicht das Problem (ich habe getestet, indem ich direkt den Wert 1
, aber immer noch den gleichen Fehler).
Ich habe eine std::monostate
eine leere Variante zu verhindern
'm_variant.index()' ist ein Laufzeitwert, Verwendung Besucher statt ('std :: Besuch ([] (auto & e) {e.Foo();}, m_variant); '). – Jarod42
Obwohl es stimmt, dass die Funktion ['index'] (http://en.cppreference.com/w/cpp/utility/variant/index) als 'constexpr' gekennzeichnet ist, ist die Variable 'm_variant' * nicht * und kann daher nicht zur Kompilierzeit verwendet werden. –
Das Ergebnis von 'std :: variant :: index()' ist nur dann ein konstanter Ausdruck, wenn das Variantenobjekt, für das es aufgerufen wird, ein konstanter Ausdruck ist. Deines ist nicht. – StoryTeller