Hej, pojawia się błąd łącznika LNK2019: nierozwiązany symbol zewnętrzny podczas próby użycia przeciążonego operatora +. Pokażę ci wycinek z klasy i sposób, w jaki go używam. Jeśli chcesz zobaczyć więcej, daj mi znać, po prostu postaram się zachować zwięzłość.Przeciążanie + operator z szablonami
/** 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_
Zwróć uwagę, że mam również [] przeciążone, dlatego właśnie uzyskuję dostęp do części m_indexu. getIndex() po prostu zwraca m_index. I wielkość() zwraca 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.
}
komunikat o błędzie:
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
Aktualizacja:
Poniżej znajduje się bezpośrednio powyżej definicji klasy. Wciąż mam ten sam błąd linkera, jak opisano powyżej.
template<typename T>
class vec;
template<typename T>
vec<T> operator + (const vec<T>&, const vec<T>&);
Aktualizacja 2: Rozwiązanie.
Powyższa aktualizacja jest niepoprawna. Rozwiązanie sbi działało, po prostu nie udało mi się dopasować operatora w następujący sposób.
template<typename T>
vec<T> operator +<T> (const vec<T>&, const vec<T>&);
sbi i David zastanawiali się, dlaczego używam przyjaciół w pierwszej kolejności. Początkowo używałem ich, ponieważ nie można przekazać dwóch parametrów do przeciążonego operatora binarnego, takiego jak +, i natychmiast poszukiwano przyjaciół jako rozwiązania. Jak się okazuje, nadal można z łatwością używać operatora binarnego za pomocą jednego parametru. Oto ostateczne rozwiązanie.
// ...
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.
Ponadto, dla każdego, kto to czyta, warto sprawdzić jego notatki na dole odpowiedzi. Są pewne rzeczy, które robiłem, które są zbędne.
Dzięki za pomoc dla wszystkich. Szczęśliwe kodowanie.
Jeśli to zadanie domowe (i wygląda podejrzanie), dodaj tag 'homework'. Wielu z nas odmawia odpowiedzi na zadania domowe w inny sposób, dzięki czemu uczysz się z nich jak najwięcej (podczas gdy inne pytania są zwykle zadawane, aby każdy, kto pyta, mógł robić to, co robi tak szybko, jak to możliwe). – sbi