模板类操作符“未解析的外部”

时间:2014-11-13 21:49:15

标签: c++ class templates math class-template

在我班上:

#ifndef __MYVECTOR_CLASS__
#define __MYVECTOR_CLASS__

template<class Type>
class MyVector{
    ....
    MyVector& operator=(const MyVector& source); //works
    friend MyVector<Type> operator+(MyVector<Type> lhs, const MyVector<Type> &rhs); //doesnt
    ....
};

template<class Type>
MyVector<Type>& MyVector<Type>::operator=(const MyVector &v){
    if (_d != v._d){
        _d = v._d;
        _deleteArray();
        _createArray(_d);
    }
    _assignValues(v._vector, (v._vector + _d));
    return *this;
};


template<class Type>
MyVector<Type> operator+(MyVector<Type> lhs, const MyVector<Type> &rhs){
    if (lhs._d == rhs._d){
        for (int index = 0; index < lhs._d; index++){
            lhs._vector[index] += rhs._vector[index];
        }
    }
    return lhs;
};

#endif // __MYVECTOR_CLASS__

Didnt包含其他非运算符函数,因为它们都运行正常。 不知道为什么它不起作用。

在源文件中:

int main(){
    MyVector<float> a(10);


    MyVector<float> b(10);
    a = b; // works alone
    a = a + b; //breaks
    return 0;
}

错误:

  1. 错误1错误LNK2001:未解析的外部符号&#34;类 MyVector __cdecl运算符+(类MyVector,类 MyVector)&#34;

  2. 错误2错误LNK1120:1个未解析的外部

  3. EDITTED:

    添加了构造函数。

    template<class Type>
    MyVector<Type>::MyVector(int size){
        _d = size;
        _createArray(_d);
        _assignValues(0);
    }
    

1 个答案:

答案 0 :(得分:1)

如果您尝试使用coliru进行编译,则会收到此警告:

  

main.cpp:15:82:警告:朋友声明&#39; MyVector   operator +(MyVector,const MyVector&amp;)&#39;宣布一个   非模板函数[-Wnon-template-friend]        朋友MyVector操作员+(MyVector lhs,const MyVector&amp; rhs); //犯规

这应该可以作为发生事情的线索。将您的代码更改为:

template<typename T>
friend MyVector<T> operator+(MyVector<T> lhs, const MyVector<T> &rhs);

it will build

友元函数本身就是一个模板,其模板参数与class MyVector分开。


更新:虽然上述内容确实有用,但在阅读this questionthis one之后,我想知道这是否更正确:

// forward-declare class MyVector
template<class Type>
class MyVector;

// forward-declare operator+()
template<class Type>
MyVector<Type> operator+(MyVector<Type> lhs, const MyVector<Type> &rhs);

template<class Type>
class MyVector{
    // declare that the already-declared operator+<>() is a friend
    friend MyVector<Type> operator+<>(MyVector<Type> lhs, const MyVector<Type> &rhs);
 };