Dla celów edukacyjnych tworzę własną klasę szablonów wektorowych w C++. Chcę, aby móc napisać (v, w) dla iloczynu skalarnego dwóch wektorów a co za tym idzie przeciążenie operator,()
następująco:C++: Domyślne inicjowanie typu całkowego w funkcji szablonu
template<class T>
const T Vector<T>::operator,(const Vector<T>& v) const
{
assertEqualSize(v);
T t;
for(size_t i=0; i<numElements; i++) {
t += elements[i] * v[i];
}
return t;
}
Moje pytanie brzmi: w jaki sposób właściwie zainicjowana t
o wartości sensownego (np 0.0
dla Vector<double>
)? Próbowałem T t();
, ale wtedy g ++ mówi mi, na przykład, że "double (*)()" nie może zostać przekonwertowane na "const double" w instrukcji return i że operator+=()
nie zostanie zdefiniowane dla "(double(), double)".
Dziękuję bardzo!
używając '(v, w)' dla produktu kropki jest raczej dziwne. Dlaczego nie po prostu przeładować '*', tj. 'V * w' dla produktu kropki? (to właśnie używam). W 3D produkt wektorowy można zaimplementować za pomocą '^'. Oczywiście mnożenie przez skalar lub macierz można również zaimplementować przy użyciu (innego przeciążenia) '*'. – Walter
Zgadzam się, że ponowne użycie operatora przecinka nie jest dobrym pomysłem. Doprowadzi to do mylącego kodu. Niestety ponowne użycie '*' również nie jest dobrym pomysłem, ponieważ nie jest jednoznaczne, ponieważ produkt krzyżowy jest oczywistym kandydatem. Zwykle zapewniam funkcje dla operacji binarnych z wykorzystaniem wektorów. – juanchopanza