下面的代码无法正常工作,我无法找到原因,我们将不胜感激。

//In Maths.h file

template <class T> class Maths{
public:
    Maths<T>(T lhs);

    template<typename U>
    Maths<T>(const Maths<U>& otherMaths);

    ~Maths();

    template <typename U>
    Maths<T>& operator+(const Maths<U>& rhs);

    template <typename U>
    Maths<T>& operator*(const Maths<U>& rhs);

    template <typename U>
    Maths<T>& operator-(const Maths<U>& rhs);

private:
    T _lhs;
};



//In Maths.cpp file
#include "Maths.h"

template <class T>
Maths<T>::Maths(T lhs){
    _lhs = lhs;
    return _lhs;
}

template <class T> template <typename U>
Maths<T>::Maths(const Maths<U>& otherMaths){
    _lhs = otherMaths._lhs;
}

template <class T>
Maths<T>::~Maths(){}

template <class T> template <typename U>
Maths<T> Maths<T>::operator+(const Maths<T>& rhs){ return Maths._lhs + rhs; }

template <class T> template <typename U>
Maths<T> Maths<T>::operator-(const Maths<T>& rhs){ return Maths._lhs - rhs; }

template <class T> template <typename U>
Maths<T> Maths<T>::operator*(const Maths<T>& rhs){ return Maths._lhs * rhs; }


问题是在VS中,它无法识别关键字运算符(即不显示为蓝色),这是为什么呢?

编辑:

我已经删除了下面指出的错误。将所有定义移到.h文件中,代码仍然无法编译,在这里发现错误:http://i.imgur.com/Z9rWOFh.png

新代码(如果有兴趣):

//in Maths.h file
template <class T> class Maths{
public:
    Maths<T>(T lhs);

    template<typename U>
    Maths<T>(const Maths<U>& otherMaths);

    ~Maths();

    T& getValue(){ return _lhs; };

    template <typename U>
    Maths<T>& operator+(const Maths<U>& rhs);

    template <typename U>
    Maths<T>& operator*(const Maths<U>& rhs);

    template <typename U>
    Maths<T>& operator-(const Maths<U>& rhs);

private:
    T _lhs;
};

template <class T>
Maths<T>::Maths(T lhs){
    _lhs = lhs;
}

template <class T> template <typename U>
Maths<T>::Maths(const Maths<U>& otherMaths){
    _lhs = otherMaths.getValue();
}

template <class T>
Maths<T>::~Maths(){}

template <class T>
Maths<T> Maths<T>::operator+(const Maths<T>& rhs){ return _lhs + rhs.getValue(); }

template <class T> template <typename U>
Maths<T> Maths<T>::operator-(const Maths<U>& rhs){ return _lhs - rhs.getValue(); }

template <class T> template <typename U>
Maths<T> Maths<T>::operator*(const Maths<U>& rhs){ return _lhs * rhs.getValue(); }

//in main.cpp

#include "Maths.h"

int main(){
    Maths<int> x = 1;
    Maths<int> y = 5;
    x + y;
    return 0;
}

最佳答案

您不能在多个文件中分开模板类的声明和实现。因此,您需要将所有实现都移至标头。
您有许多现在看不到的错误(例如,返回构造函数)。我建议您在类声明中移动实现。对其进行更正,调试,进行一些测试,然后在仍然需要时尝试将实现移至外部。
Visual Studio(在这种情况下为IntelliSense)有时会在突出显示时出现一些错误(或者可能很慢)。不要专注于此。如果出现问题,编译器会为您提供更精确的错误和警告。


我可以告诉您一些错误:


构造函数return中的Maths<T>( T lhs );
return Maths._lhs + rhs;-Maths是一个类,但是您使用实例进行操作。如果需要获取指向当前实例的指针,请使用this->_lhs或仅_lhs
_lhs = otherMaths._lhs;-您无法访问private字段;您可以获得类_lhs的值Maths< T >,但是Maths< U >是不同的类。因此,您需要制作一些功能,例如T& value( ) { return _lhs; }并在此处使用它;


编辑:

仍然有一些错误。如您在错误描述中所见,您的实现

template <class T>
Maths<T> Maths<T>::operator+(const Maths<T>& rhs){ return _lhs + rhs.getValue(); }


与函数定义不匹配

// in class template <class T> class Maths
template <typename U>
Maths<T>& operator+(const Maths<U>& rhs);


(就像一个游戏-找到差异= D)
正确的方法是这样的:

// declaration
template <typename U>
Maths<T> operator+(const Maths<U>& rhs);
// ...
// definition
template <class T>
template <typename U>
Maths<T> Maths<T>::operator+(const Maths<U>& rhs) { return _lhs + rhs.getValue( ); }


我从声明中删除了&并将template <typename U>添加到定义中。对于operator-operator*,您需要删除&
下一个可能出现的问题是getValue没有常量声明。您需要添加新方法。

const T& getValue( ) const { return _lhs; }

10-04 14:51