Перегрузка + оператор с шаблонами

Эй, я получаю ошибку компоновщика LNK2019: неразрешенная внешняя ссылка при попытке использовать перегруженное + оператор. Я покажу, что Вы отрезаете - от класса, и как я использую его в основном. Если необходимо видеть больше, сообщите мне, я просто собираюсь попытаться сохранить вещи краткими.

/** vec.h **/
#ifndef __VEC_H_
#define __VEC_H_

#include <iostream>
#include <vector>

namespace xoor{

    template<typename T> 
    class vec{

    public:
        inline friend vec<T> operator + (const vec<T>&, const vec<T>&);
        inline const vec<T>& operator += (const vec<T>&);

    private:
        std::vector<T> m_index;
    }; // Vec.


    template<typename T> 
    vec<T>& operator + (const vec<T>& a, const vec<T>& b){
        vec<T> product = a;
        product += b;

        return product;
    } // Addition.

    template<typename T> 
    const vec<T>& vec<T>::operator += (const vec<T>& v){
        for (unsigned short i =0; i < m_index.size(); ++i){
            if (i >= v.size())
                break;
            m_index[i] += v.getIndex()[i];
        }

        return * this;
    } // Addition Compound.


} // xoor

#endif // __VEC_H_

Обратите внимание, что я имею [] перегруженный также, таким образом, я просто получаю доступ к частям m_index с ним. getIndex () просто возвращает m_index. И размер () возвращает m_index.size ()

/** main.cpp **/

#include <iostream>
#include "vec.h"

void testHook();

int main(){
    testHook();
    system("PAUSE");
    return 0;
}

void testHook(){
    using namespace xoor;
    vec<double> vA(3); // passing 3 for 3 elements
    vec<double> vB(3);

    // v + v
    std::cout << "\n\tA + B = ";
    vec<double> vAB(3);
    vAB = vA + vB; // PRODUCES THE LNK2019
    vAB.print(std::cout); // Outputs the vec class to the console.
}

Сообщение об ошибке:

Error   1   error LNK2019: unresolved external symbol "class xoor::vec<double> __cdecl xoor::operator+(class xoor::vec<double> const &,class xoor::vec<double> const &)" (??Hxoor@@YA?AV?$vec@N@0@ABV10@0@Z) referenced in function "void __cdecl testHook(void)" (?testHook@@YAXXZ)    main.obj

Обновление:

Следующее теперь непосредственно выше определения класса. Я продолжаю получать ту же ошибку компоновщика, как описано выше.

    template<typename T> 
    class vec;

    template<typename T> 
    vec<T> operator + (const vec<T>&, const vec<T>&); 

Обновление 2: решение.

Вышеупомянутое обновление является неправильным. решение sbi действительно работало, мне просто не удалось обработать оператор по шаблону следующим образом.

    template<typename T> 
    vec<T> operator +<T> (const vec<T>&, const vec<T>&); 

sbi и david обсуждали, почему я использовал друзей во-первых. Первоначально я использовал их, потому что Вы не можете передать два параметра перегруженному бинарному оператору такой, поскольку +, и непосредственный искал друзей как решение. Как оказалось, можно все еще использовать бинарного оператора довольно легко с единственным параметром. Вот конечное решение.

// ...
template<typename T> 
class vec{
    public:
    const vec<T> operator + (const vec<T>&, const vec<T>&)const;
    // ...

}; // Vec.

template<typename T> 
const vec<T> vec<T>::operator + (const vec<T>& v)const{
    matrix<T> product = *this;
    vec(product += v);
} // Addition.

Кроме того, для кого-либо еще читающего это, его разумное для проверки примечания sbi в нижней части его ответа. Существуют некоторые вещи, которые я делал, которые являются лишними.

Спасибо за справку все. Счастливое кодирование.

5
задан 26 July 2010 в 15:57
поделиться