valeurs par défaut dans C++ sont le sucre syntaxique; le compilateur insère essentiellement l'argument pour vous sur le site d'appel. Cela signifie que le compilateur doit savoir quelle est la valeur par défaut, donc il doit être fourni par la déclaration de fonction. Cela signifie également que si vous avez des méthodes d'héritage et des méthodes virtuelles, les valeurs par défaut utilisées sont celles du type statique (c'est-à-dire, le type du compilateur) et non du type d'exécution. Par exemple:
class Base
{
public:
virtual ~Base() { }
virtual std::string foo(std::string s = "b") { return "Base:" + s; }
};
class Derived
: public Base
{
public:
virtual std::string foo(std::string s = "d") { return "Derived:" + s; }
};
int main(void)
{
Derived d;
Base& b = d;
std::cout << b.foo() << std::endl;
return 0;
}
imprimera Derived:b
, pas Derived:d
.
Oh ouais. Même fichier, mais l'appel est avant la définition. Facile à deviner pourquoi! Bien que j'avais la perception fictive (basée sur le hasard, bien sûr) que le problème était lié aux fonctions avec tous les paramètres avec des valeurs par défaut. À la votre! – huff