je le code suivant C++ dans Visual Studio 2005 ...C++: Pourquoi VS2005 interprète-t-il une initialisation directe de l'instance locale comme une fonction, lorsque le constructeur de la classe a un paramètre polymorphe?
class Base {};
class Derived : public Base {};
class Other {
public:
Other(const Base& obj) {}
void test() {}
};
int _tmain(int argc, _TCHAR* argv[])
{
Other other(Derived());
other.test();
return 0;
}
... Compilation échoue et donne:
test.cpp(19) : error C2228: left of '.test' must have class/struct/union
J'ai déterminé par quelques tests que cela se produit parce que le La déclaration de la variable "other" est interprétée comme une déclaration de fonction (renvoyant un Autre et prenant un paramètre Derived), au lieu d'une instance de Other utilisant le constructeur à un seul argument. (VS6 trouve le constructeur et compile très bien, mais ce n'est pas bon à la norme C++, donc je ne lui fais pas confiance par rapport à VS2005)
Si je fais ...
Other other(static_cast<Base&>(Derived()));
... ou de l'utilisation copie-initialisation, ça fonctionne bien. Mais il ne semble pas voir que l'instance Derived() est dérivée de Base par elle-même, ou elle donne la priorité à la déclaration de fonction au lieu d'essayer le polymorphisme sur le paramètre constructeur.
Ma question est: est ce comportement C++ standard, ou est ce comportement VS2005-spécifique? Au cas où ...
Other other(Derived());
... déclarer une instance locale dans la norme C++, ou doit-il déclarer une fonction?
pour votre information, cette question est appelée « Le plus contrariant Parse » –
Il vous manque des points-virgules dans votre classe 'Other' mais ça ne fait pas partie de votre question ... –