Le problème vient d'un conflit intéressant de nouvelles fonctionnalités C++ et de ce que vous essayez de faire. Tout d'abord, nous allons jeter un oeil à la signature push_back
:
void push_back(const T&)
Il attend un référence à un objet de type T
. Sous l'ancien système d'initialisation, un tel membre existe. Par exemple, le code suivant compile très bien:
#include <vector>
class Foo {
public:
static const int MEMBER;
};
const int Foo::MEMBER = 1;
int main(){
std::vector<int> v;
v.push_back(Foo::MEMBER); // undefined reference to `Foo::MEMBER'
v.push_back((int) Foo::MEMBER); // OK
return 0;
}
C'est parce qu'il est un objet réel qui a quelque part que la valeur stockée. Si, toutefois, vous passez à la nouvelle méthode de spécification des membres const statiques, comme vous l'avez ci-dessus, Foo::MEMBER
n'est plus un objet. Il est une constante, un peu semblable à:
#define MEMBER 1
Mais sans les maux de tête d'une macro préprocesseur (et avec la sécurité de type). Cela signifie que le vecteur, qui attend une référence, ne peut en obtenir un.
J'ai modifié la question pour mettre le code en retrait de quatre espaces au lieu d'utiliser
. Cela signifie que les chevrons ne sont pas interprétés comme HTML. –acclamations :) La règle min de 10 caractères est parfois ennuyante;) –