Oye, recibo un error de enlazador LNK2019: símbolo externo no resuelto al intentar usar un operador + sobrecargado. Te mostraré snip-its de la clase, y cómo lo estoy usando en main. Si necesita ver más, hágamelo saber, voy a tratar de mantener las cosas concisas.Sobrecarga + Operador con plantillas
/** 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_
Tenga en cuenta que tengo [] sobrecargado, así, así que sólo voy a acceder a partes de m_index con él. getIndex() simplemente devuelve m_index. Y el tamaño() devuelve 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.
}
mensaje de error:
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]@YA?A[email protected]@[email protected]@[email protected]) referenced in function "void __cdecl testHook(void)" ([email protected]@YAXXZ) main.obj
Actualización:
El siguiente es ahora directamente por encima de la definición de clase. Continúo obteniendo el mismo error de enlazador, como se describe arriba.
template<typename T>
class vec;
template<typename T>
vec<T> operator + (const vec<T>&, const vec<T>&);
Actualización 2: Solución.
La actualización anterior es incorrecta. La solución de sbi sí funcionó. No reproduje el operador de la siguiente manera.
template<typename T>
vec<T> operator +<T> (const vec<T>&, const vec<T>&);
sbi y David estaban discutiendo por qué estaba usando amigos en primer lugar. Inicialmente los estaba usando, porque no se pueden pasar dos parámetros a un operador binario sobrecargado, como +, y amigos buscados inmediatamente como la solución. Como resultado, todavía puede usar el operador binario con bastante facilidad con un solo parámetro. Aquí está la solución final.
// ...
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.
Además, para cualquier otra persona leyendo esto, vale la pena, mientras que para ver las notas de OSE en el fondo de su respuesta. Hay algunas cosas que he estado haciendo que son superfluas.
Gracias por la ayuda de todos. Feliz codificación.
Si esta es la tarea (y parece sospechosamente), debe agregar la etiqueta 'homework'. Muchos de nosotros respondemos las preguntas de la tarea de manera diferente, de modo que aprendas tanto como sea posible de esto (mientras que otras preguntas generalmente se hacen para que quien pregunta puede seguir haciendo lo que hace lo más rápido posible). – sbi