Springen naar inhoud

C++ template klasse


  • Log in om te kunnen reageren

#1

Jekke

    Jekke


  • >250 berichten
  • 997 berichten
  • Ervaren gebruiker

Geplaatst op 23 juli 2010 - 19:47

Ik probeer een generieke template klasse te maken. De niet-generieke versie heb ik volledig werkende:

#ifndef _MATRIX_HPP
#define _MATRIX_HPP

#include <iostream>
#include <cassert>
#include <algorithm>

class matrix
{
  public:
	typedef double  value_type;
	typedef size_t  size_type;
	enum order_t { row_major, column_major };

	// Constructor
	matrix(size_type nb_rows, size_type nb_cols, value_type init=0, order_t order=row_major)
	: n(nb_rows), m(nb_cols), data(new value_type[nb_rows*nb_cols]), ord(order)
	{
	 value_type* temp=data;
	 for(size_type i=0;i<nb_rows*nb_cols;++i){
	  *temp=init;
	  ++temp;
	 }
	}

	...

  protected:
	size_type n; // number of rows
	size_type m; // number of columns
	value_type* data;
	order_t ord;
};

// Free functions operating on matrix:

// Add two matrices and return a new matrix
matrix operator+(const matrix& A, const matrix& B);

// multiply by a scalar: symmetric thus we need two functions
matrix operator*(const matrix& A, matrix::value_type alpha);
matrix operator*(matrix::value_type alpha, const matrix& A);

// Consider two matrix objects a and b as being two vectors of size n * m
// stacking all elements next to each other, then
// calculate their inner product
matrix::value_type vected_inner_product(const matrix& a, const matrix& b);

// calculate the 1-norm (maximum absolute column sum)
matrix::value_type norm_1(const matrix& A);

// calculate the Frobenius-norm (2-norm of the stacked matrix as a vector)
matrix::value_type norm_frob(const matrix& A);

// print the matrix in a nice format on screen
std::ostream& operator<<(std::ostream& out, const matrix& A);

#endif // _MATRIX_HPP

Nu probeer ik als volgt de klasse generisch te maken:


#ifndef _MATRIX_HPP
#define _MATRIX_HPP

#include <iostream>
#include <cassert>
#include <algorithm>

template <typename T> class matrix
{
  public:
	typedef T value_type;
	typedef size_t  size_type;
	enum order_t { row_major, column_major };

	// Constructor
	matrix(size_type nb_rows, size_type nb_cols, value_type init=0, order_t order=row_major)
	: n(nb_rows), m(nb_cols), data(new value_type[nb_rows*nb_cols]), ord(order)
	{
	 value_type* temp=data;
	 for(size_type i=0;i<nb_rows*nb_cols;++i){
	  *temp=init;
	  ++temp;
	 }
	}

	...

  protected:
	size_type n; // number of rows
	size_type m; // number of columns
	value_type* data;
	order_t ord;
};

// Free functions operating on matrix:

// Add two matrices and return a new matrix
matrix operator+(const matrix& A, const matrix& B);  //(*)

// multiply by a scalar: symmetric thus we need two functions
matrix operator*(const matrix& A, matrix::value_type alpha);
matrix operator*(matrix::value_type alpha, const matrix& A);

// Consider two matrix objects a and b as being two vectors of size n * m
// stacking all elements next to each other, then
// calculate their inner product
matrix::value_type vected_inner_product(const matrix& a, const matrix& b);

// calculate the 1-norm (maximum absolute column sum)
matrix::value_type norm_1(const matrix& A);

// calculate the Frobenius-norm (2-norm of the stacked matrix as a vector)
matrix::value_type norm_frob(const matrix& A);

// print the matrix in a nice format on screen
std::ostream& operator<<(std::ostream& out, const matrix& A);

#endif // _MATRIX_HPP

Maar dan krijg ik een hele lijst errors bij het compileren over de 'free functions'
bvb bij de lijn (*) krijg ik "expected constructor, destructor, or type conversion before "operator""

voor de echte liefhebbers heb ik de code bijgevoegd in bijlage

Bijgevoegde Bestanden


Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

Jekke

    Jekke


  • >250 berichten
  • 997 berichten
  • Ervaren gebruiker

Geplaatst op 23 juli 2010 - 21:55

ik vermoed dat ik het zo zal moeten doen:
template <typename T1> matrix<T1> operator+(const matrix<T1>& A, const matrix<T1>& B);

maar dan krijg ik een foutmelding ("expected ";" before i") bij de volgende implementatie:
#include "matrix.hpp

template <typename T1> T1 vected_inner_product(const matrix<T1>& a, const matrix<T1>& b){
 T1 temp=0;
 for(matrix<T1>::size_type i=1;i<=a.nb_rows();++i){
  for(matrix<T1>::size_type j=1;j<=a.nb_cols();++j){
   temp+=a(i,j)*b(i,j);
  }
 }
 return temp;
}

#3

Jekke

    Jekke


  • >250 berichten
  • 997 berichten
  • Ervaren gebruiker

Geplaatst op 23 juli 2010 - 22:29

#include "matrix.hpp

template <typename T1> T1 vected_inner_product(const matrix<T1>& a, const matrix<T1>& b){
 T1 temp=0;
 for(matrix<T1>::size_type i=1;i<=a.nb_rows();++i){
  for(matrix<T1>::size_type j=1;j<=a.nb_cols();++j){
   temp+=a(i,j)*b(i,j);
  }
 }
 return temp;
}


dit moest zo:


#include "matrix.hpp

template <typename T1> T1 vected_inner_product(const matrix<T1>& a, const matrix<T1>& b){
 T1 temp=0;
 for(typename matrix<T1>::size_type i=1;i<=a.nb_rows();++i){
  for(typename matrix<T1>::size_type j=1;j<=a.nb_cols();++j){
   temp+=a(i,j)*b(i,j);
  }
 }
 return temp;
}





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures