определение функций шаблонных классов

 
0
 
C++
ava
nanotexnik | 22.03.2013, 19:01
есть определенние шаблоного класса:


        template<class T>
    class Vector2D
    {
    public:
        T mX;
        T mY;
        Vector2D(const T &x, const T &y);
        Vector2D &operator+(const Vector2D<T> &);
    };


Пытаюсь определить конструктор и оператор +, следующим образом:        

        template<class T> 
    Vector2D<T>::Vector2D(T x, T y)
    {
        mX = x;
        mY = y;
    }

    template<class T> 
    Vector2D<T> &Vector2D<T>::operator+(Vector2D<T> &t)
    {
        mX += t.mX;
        mY += t.mY;
                return this;
    }


Получаю ошибки следующего рода:
Error    1    error C2244: 'Vector2D<T>::Vector2D' : unable to match function definition to an existing declaration    c:\users\nano\documents\visual studio 2010\projects\test2\actualvector\vector2d.cpp    10 

В чем может быть проблема?
Comments (6)
ava
azesmcar | 22.03.2013, 18:11 #
А почему пропустил ключевое слово const в определениях?

template<class T>
class Vector2D
{
public:
   T mX;
   T mY;

   Vector2D(const T &x, const T &y);
   Vector2D &operator+(const Vector2D<T> &);
};

template<class T> 
Vector2D<T>::Vector2D(const T &x, const T &y)
{
   mX = x;
   mY = y;
}

template<class T> 
Vector2D<T> &Vector2D<T>::operator+(const Vector2D<T> &t)
{
   mX += t.mX;
   mY += t.mY;
   return this;
}


P.S.
В конструкторе лучше использовать список инициализации

template<class T> 
Vector2D<T>::Vector2D(const T &x, const T &y)
   : mX(x), mY(y)
{
}
ava
nanotexnik | 22.03.2013, 18:17 #
спасибо, ошибка по невнимательности...

теперь вернулся к другой ошибке, значение которой я не понимаю

Error    1    error LNK2019: unresolved external symbol "public: __thiscall Vector2D<int>::Vector2D<int>(int const &,int const &)" (??0?$Vecto[email protected]@@[email protected]@Z) referenced in function _main    C:\Users\nano\Documents\Visual Studio 2010\Projects\Test2\ActualVector\main.obj


Создание объектов происходит следующим образом:

int main()
{
    Vector2D<int> vector(3,2);
    Vector2D<int> vector2(4,5);
    std::cout << "size:" << sizeof(vector) << std::endl;
    std::cout << "size2:" << sizeof(vector2) << std::endl;    
    return 0;
}
ava
azesmcar | 22.03.2013, 18:20 #
Не скажу, что я не ждал этого вопроса :)

Перенеси определения функций в заголовочный файл. С шаблонами по другому никак.

template<class T>
class Vector2D
{
public:
   T mX;
   T mY;
   Vector2D(const T &x, const T &y): mX(x), mY(y) {};
   Vector2D &operator+(const Vector2D<T> &)
   {
      mX += t.mX;
      mY += t.mY;
      return this;
   };
};
ava
nanotexnik | 22.03.2013, 18:23 #
Жаль, что нельзя. В своем справочнике по С++ ничего не нашел по данному поводу smile 

Спасибо.
ava
volatile | 22.03.2013, 19:10 #
Цитата (nanotexnik @  22.3.2013,  18:23 findReferencedText)
Жаль, что нельзя. 

Если вы будете использовать только с инт, или только с определенным небольши набором типов, то можно
явно инстанцировать их, и не переносить в заголовок.


template class Vector2D <int>; // куда-нибудь в сипишник, где нахояцца эти шаблоны

(но это, не очень кошерный путь.)
ava
VSB | 24.03.2013, 02:06 #
И еще по моему, нужно

return *this;
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit