J'essaie de fournir deux constructeurs différents pour une classe C++, y compris un membre std :: vecteur:C++ liste initialiseur ci-joint brace dans le constructeur délégué
class A {
public:
std::vector<int> p;
A (std::vector<int> i) { p = i; }
A (int x, int y, int z) : A ({x, y, z}) {}
};
int main() {
A a ({1, 2, 3});
A a2 (1, 2, 3);
return 0;
}
Le premier constructeur fonctionne bien, mais le second jette le erreur suivante:
error: call of overloaded ‘A(<brace-enclosed initializer list>)’ is ambiguous
Quelle est la différence entre les deux méthodes?
Vous pouvez lire [les notes] (http://coliru.stacked-crooked.com/a/72bc6715d2140911). – LogicStuff
Bien sûr, c'est ambigu. '{x, y, z}' Les deux peuvent créer un 'A' temporaire à partir duquel notre' A' actuel doit être copié/déplacé, ou un 'vecteur' à partir duquel' A' doit être construit. Comment le compilateur est-il supposé choisir? – StoryTeller
Lorsque vous obtenez des erreurs, lisez toujours le message d'erreur * full *. Il peut souvent y avoir des notes d'information qui devraient vous aider à comprendre ce qui se passe. –