Hey, j'obtiens une erreur de lieur LNK2019: symbole externe non résolu en essayant d'utiliser un opérateur + surchargé. Je vais vous montrer snip-its de la classe, et comment je l'utilise dans le principal. Si vous avez besoin de voir plus, faites le moi savoir, je vais juste essayer de garder les choses concises.Surcharge + opérateur avec des modèles
/** vec.h **/
#ifndef __VEC_H_
#define __VEC_H_
#include <iostream>
#include <vector>
namespace xoor{
template<typename T>
class vec{
public:
inline friend vec<T> operator + (const vec<T>&, const vec<T>&);
inline const vec<T>& operator += (const vec<T>&);
private:
std::vector<T> m_index;
}; // Vec.
template<typename T>
vec<T>& operator + (const vec<T>& a, const vec<T>& b){
vec<T> product = a;
product += b;
return product;
} // Addition.
template<typename T>
const vec<T>& vec<T>::operator += (const vec<T>& v){
for (unsigned short i =0; i < m_index.size(); ++i){
if (i >= v.size())
break;
m_index[i] += v.getIndex()[i];
}
return * this;
} // Addition Compound.
} // xoor
#endif // __VEC_H_
Notez que j'ai [] surchargée aussi bien, donc je vais juste accéder à certaines parties de m_index avec elle. getIndex() retourne juste m_index. Et la taille() retourne m_index.size()
/** main.cpp **/
#include <iostream>
#include "vec.h"
void testHook();
int main(){
testHook();
system("PAUSE");
return 0;
}
void testHook(){
using namespace xoor;
vec<double> vA(3); // passing 3 for 3 elements
vec<double> vB(3);
// v + v
std::cout << "\n\tA + B = ";
vec<double> vAB(3);
vAB = vA + vB; // PRODUCES THE LNK2019
vAB.print(std::cout); // Outputs the vec class to the console.
}
Message d'erreur:
Error 1 error LNK2019: unresolved external symbol "class xoor::vec<double> __cdecl xoor::operator+(class xoor::vec<double> const &,class xoor::vec<double> const &)" ([email protected]@[email protected]@[email protected]@[email protected]) referenced in function "void __cdecl testHook(void)" ([email protected]@YAXXZ) main.obj
Mise à jour:
Voici maintenant directement au-dessus de la définition de la classe. Je continue d'avoir la même erreur de lien, comme décrit ci-dessus.
template<typename T>
class vec;
template<typename T>
vec<T> operator + (const vec<T>&, const vec<T>&);
Mise à jour 2: Solution.
La mise à jour ci-dessus est incorrecte. La solution de sbi a fonctionné, je n'ai pas réussi à modéliser l'opérateur comme suit.
template<typename T>
vec<T> operator +<T> (const vec<T>&, const vec<T>&);
sbi, et David discutaient de la raison pour laquelle j'utilisais des amis en premier lieu. Initialement je les utilisais, parce que vous ne pouvez pas passer deux paramètres à un opérateur binaire surchargé tel que +, et les amis immédiatement sollicités comme solution. Comme il s'avère, vous pouvez toujours utiliser l'opérateur binaire assez facilement avec un seul paramètre. Voici la solution finale.
// ...
template<typename T>
class vec{
public:
const vec<T> operator + (const vec<T>&, const vec<T>&)const;
// ...
}; // Vec.
template<typename T>
const vec<T> vec<T>::operator + (const vec<T>& v)const{
matrix<T> product = *this;
vec(product += v);
} // Addition.
Aussi, pour toute personne d'autre lecture de cela, la peine de vérifier les notes de l'OSMŒ au fond de sa réponse. Il y a des choses que je fais qui sont superflues.
Merci pour l'aide à tous. Codage heureux.
S'il s'agit de devoirs (et cela vous semble suspect), vous devez ajouter l'étiquette 'devoirs '. Beaucoup d'entre nous répondent différemment aux questions de devoirs, de sorte que vous en apprenez le plus possible (alors que d'autres questions sont habituellement posées pour que ceux qui posent la question puissent continuer à faire ce qu'ils font le plus vite possible). – sbi