Re: template function member with const classifier
 
Pedro Sousa wrote:
Hi,
I'm trying to create an template class that represent points in all
possible dimensions, what I've made until now is
#ifndef _POINT_HPP_
#define _POINT_HPP_
All names starting with an underscore and capital letter are reserved
for use by the implementation. Change this.
#include <vector>
template <typename T>
class Point{
private:
   std::vector<T> coordinates;
public:
   explicit Point( int n );
   Point( const Point<T>& other );
   Point( const std::vector<T>& coord );
   ~Point();
   std::vector<T> Get_Coordinates() const;
   void Set_Coordinates( const std::vector<T>& coord );
   void Translate( const std::vector<T>& coord );
   void Scale( const T& factor );
   //unsigned int Distance( const Point<T>& other );
   //unsigned int Distance_Origin()
   void WriteLn();
private:
   static const int Expt_Different_Sizes;
};
template <typename T>
Point<T>::Point( int n ):
   coordinates( n )
{
}
template <typename T>
Point<T>::Point( const Point<T>& other ):
   coordinates( other.coordinates )
{
}
template <typename T>
Point<T>::Point( const std::vector<T>& coord ):
   coordinates( coord )
{
}
template <typename T>
Point<T>::~Point()
{
}
template <typename T>
void Point<T>::Set_Coordinates( const std::vector<T>& coord )
{
   if( coordinates.size() != coord.size() )
     throw Point<T>::Expt_Different_Sizes;
   else
     {
     for( int i=0; i<coordinates.size(); i++ )
       coordinates[i] = coord[i];
     }
}
template <typename T>
std::vector<T> Get_Coordinates() const
{
   return coordinates;
}
template <typename T>
void Point<T>::Translate( const std::vector<T>& coord )
{
   if( coordinates.size() != coord.size() )
     throw Point<T>::Expt_Different_Sizes;
   // Add the two coordinates
   for( int i = 0; i < coordinates.size(); ++i )
     coordinates[i] = coordinates[i] + coord[i];
}
template <typename T>
void Point<T>::Scale( const T& factor )
{
   if( factor == 0 )
     throw Point<T>::Expt_Divide_By_Zero;
   else
     {
     for( int i = 0; i< coordinates.size(); i++ )
       coordinates[i] = coordinates[i]/factor;
     }
}
template <typename T>
void Point<T>::WriteLn()
{
   typename std::vector<T>::iterator pos;
   for( pos = coordinates.begin(); pos < coordinates.end(); ++pos)
     std::cout << *pos << " ";
   std::cout << std::endl;
}
// Specify the exception code
template <typename T>
const int Point<T>::Expt_Different_Sizes = 1;
template <typename T>
const int Point<T>::Expt_Divide_By_Zero = 2;
#endif
[snip copy and paste error]
But I'm getting the errors
In file included from src/GUI.cpp:12:
include/point.hpp:84: error: non-member function `std::vector<T,
    std::allocator<_CharT> > Get_Coordinates()' cannot have `const' method
    qualifier
That's because Get_Coordinates is not a member of your class, but it
should be since it accesses your class members. See also this FAQ:
http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.10
include/point.hpp:127: error: `const int Point<T>::Expt_Divide_By_Zero'
is not
    a static member of `class Point<T>'
This one is quite straight forward: the constant is not a member of
your class at all.
include/point.hpp:127: error: template definition of non-template `const
int
    Point<T>::Expt_Divide_By_Zero'
This is because of the previous error.
make: *** [GUI.o] Error 1
Can any one give me an inch about want I'm doing wrong? If you could
send me some links I would appreciate.
If we give you an inch, you might take a mile. So, no. But I have given
you some hints. :-)
Cheers! --M