Bonjour à tous !

Dernièrement, lors d'un stage, j'ai dû coder une classe représentant des vecteurs tridimensionnelles. Je l'ai codé en dérivant la classe valarray de la manière suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#ifndef VECTOR3D_HPP
#define VECTOR3D_HPP
 
#include <valarray>
#include <ostream>
#include <cmath>
 
template <typename T>
struct Vector3D : public std::valarray<T>
{
	Vector3D() : std::valarray<T>(static_cast<T>(0), 3) {}
	Vector3D(T x, T y, T z) : std::valarray<T>({x,y,z}) {} //C++0x
 
	T norm() const { return std::sqrt(((*this)*(*this)).sum()); }
	T norm2() const { return ((*this)*(*this)).sum(); }
 
};
 
template <typename T>
std::ostream& operator<<(std::ostream& out, const std::valarray<T>& v)
{
	const size_t end(v.size()-1);
	for(size_t i(0); i < end; ++i)
		out << v[i] << ' ';
	out << v[end];
	return out;
}
 
typedef Vector3D<double> Vect3d;
typedef Vector3D<int> Vect3i;
 
#endif
Avec ce code, je retrouve toutes les opérations importantes des vecteurs. Cependant les codes suivants ne marchent pas :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include "Vector3D.hpp"
 
using namespace std;
 
int main()
{
	Vect3d v(1,2,3);
	cout <<  v*v << '\n'; // Erreur de syntaxe 
	return 0;
}
Il y a une erreur au niveau de l'affichage dans la console et je ne vois vraiment pas d'où ça vient. Savez-vous d'où vient le problème sachant que le message d'erreur est le suivant?

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 g++ main.cpp -o vector3d -std=c++0x
main.cpp: In function ‘int main()’:
main.cpp:9: erreur: no match foroperator<<’ in ‘std::cout << std::operator* [with _Tp = double](((const std::valarray<double>&)((const std::valarray<double>*)(& v.Vector3D<double>::<anonymous>))), ((const std::valarray<double>&)((const std::valarray<double>*)(& v.Vector3D<double>::<anonymous>))))’
/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../include/c++/4.4.4/ostream:108: note: candidats sont: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>& (*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../include/c++/4.4.4/ostream:117: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ios<_CharT, _Traits>& (*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../include/c++/4.4.4/ostream:127: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base& (*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../include/c++/4.4.4/ostream:165: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../include/c++/4.4.4/ostream:169: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../include/c++/4.4.4/ostream:173: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../include/c++/4.4.4/bits/ostream.tcc:91: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../include/c++/4.4.4/ostream:180: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../include/c++/4.4.4/bits/ostream.tcc:105: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../include/c++/4.4.4/ostream:191: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../include/c++/4.4.4/ostream:200: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../include/c++/4.4.4/ostream:204: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../include/c++/4.4.4/ostream:209: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(double) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../include/c++/4.4.4/ostream:213: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../include/c++/4.4.4/ostream:221: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long double) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../include/c++/4.4.4/ostream:225: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(const void*) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../include/c++/4.4.4/bits/ostream.tcc:119: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_streambuf<_CharT, _Traits>*) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../include/c++/4.4.4/bits/valarray_after.h:409: note:                 std::_Expr<std::_BinClos<std::__shift_left, std::_Constant, std::_Expr, typename _Dom::value_type, _Dom>, typename std::__fun<std::__shift_left, typename _Dom1::value_type>::result_type> std::operator<<(const typename _Dom::value_type&, const std::_Expr<_Dom1, typename _Dom1::value_type>&) [with _Dom = std::_BinClos<std::__multiplies, std::_ValArray, std::_ValArray, double, double>]
Merci de votre aide !