J'ai créé une classe de vecteur qui contient 3 paramètres et surchargé le - = opérateur mais quand j'essaie d'utiliser cet opérateur p>
3 Réponses :
ce
est un pointeur et ce [i]
ne fait pas ce que vous attendez. Il prend ceci
et exécute l'arithmétique du pointeur. La seule valeur de i
qui n'est pas UB est alors 0
et le type de cette expression est Static3Vector
C'est à peu près équivalent à ceci:
T& operator [] (const size_t& i) { return m_coords[i]; } const T& operator [] (const size_t& i) const { return m_coords[i]; }
Vous pouvez le résoudre de deux manières:
(*this)[i] -= rhs[i]; //dereference first this->operator[](i) -= rhs[i]; //call operator explicitly m_coords[i] -= rhs[i]; //don't use overloaded operator, use data directly
Encore une chose : Les deux premiers ne fonctionneront pas avec votre implémentation actuelle, car votre opérateur []
renvoie une copie de la valeur qu'il stocke. Il est plus courant pour operator []
de renvoyer une référence à un objet stocké:
Static3Vector<int> vec1(1,2,3); Static3Vector<int>* ptr = &vec1; ptr[0]; //ok, equivalent to *ptr ptr[1]; //compiles, but invokes UB
Voir aussi Quelles sont les règles et expressions de base pour la surcharge des opérateurs?
Jetez un coup d'œil à vos opérateurs d'indexation:
T operator [] (const size_t& i) { return m_coords[i]; } T operator [] (const size_t& i) const { return m_coords[i]; }
Il y a une utilisation incorrecte de l'opérateur de l'indice. Dans les définitions de l'opérateur comme par exemple dans ce dans cette instruction p> il est utilisé l'opérateur Industri intégré intégré pour un Objet du type de pointeur Vous devez écrire p> ou p> Le type de retour doit également être un type référencé comme p> et p> static3vector * code>. p>
Est-ce que const Static3Vector & operator - = (const Static3Vector & rhs) const est appelé pour les objets const? pourquoi voudrais-je soustraire d'un objet const?
@SzymonO C'était une faute de frappe. J'ai oublié qu'il s'agit d'un opérateur d'affectation composé. Je pensais que c'était l'opérateur moins. :)