下面的代码无法正常工作,我无法找到原因,我们将不胜感激。
//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; }