Der folgende Code nicht kompiliert:boost :: variant und Funktionsüberladungsauflösung
#include <boost/variant.hpp>
class A {};
class B {};
class C {};
class D {};
using v1 = boost::variant<A, B>;
using v2 = boost::variant<C, D>;
int f(v1 const&) {
return 0;
}
int f(v2 const&) {
return 1;
}
int main() {
return f(A{});
}
beiden gcc und Klirren klagt mit:
test1.cpp: In function ‘int main()’:
test1.cpp:18:17: error: call of overloaded ‘f(A)’ is ambiguous
return f(A{});
^
test1.cpp:18:17: note: candidates are:
test1.cpp:11:5: note: int f(const v1&)
int f(v1 const&) {
^
test1.cpp:14:5: note: int f(const v2&)
int f(v2 const&) {
Da nicht möglich ist, ein v2
Objekt zu konstruieren von einer A
Instanz, warum der Compiler beiden Funktionen bei der Überladungsauflösung die gleiche Priorität gibt?
"Variante" hat implizite konvertierte Konstruktoren Templates. Wenn diese nicht ausreichend mit 'enable_if' geschützt sind, könnte dies das Ergebnis sein. – pmr