C++ 为模板类声明模板方法
我试图在一个模板类上声明一个模板方法,但它对我不起作用。 最好通过给出代码进行解释,如下所示: 我有这门课: 矩阵hC++ 为模板类声明模板方法,c++,templates,matrix,C++,Templates,Matrix,我试图在一个模板类上声明一个模板方法,但它对我不起作用。 最好通过给出代码进行解释,如下所示: 我有这门课: 矩阵h 模板 类矩阵{ 私人: int x; int-y; 公众: 类非法操作(); 模板 矩阵算子+(常数矩阵m); //... } matrix.cpp 模板 模板 矩阵::运算符+(常数矩阵m){ 如果(a!=c | | b!=d)抛出非法操作(); //添加矩阵并返回结果 } 我希望这段代码适用于任意两种类型的矩阵以及a、b、c和d可以不同的矩阵。 例如,我希望此代码编译并返
模板
类矩阵{
私人:
int x;
int-y;
公众:
类非法操作();
模板
矩阵算子+(常数矩阵m);
//...
}
matrix.cpp
模板
模板
矩阵::运算符+(常数矩阵m){
如果(a!=c | | b!=d)抛出非法操作();
//添加矩阵并返回结果
}
我希望这段代码适用于任意两种类型的矩阵以及a、b、c和d可以不同的矩阵。
例如,我希望此代码编译并返回一个错误(在运行时):
常数矩阵m1;
常数矩阵m2;
//初始m1和m2
m1+m2;
虽然此代码应编译并成功运行:
const Matrix<int, 3, 2> m1;
const Matrix<int, 3, 2> m2;
// init m1 and m2
m1+m2;
常数矩阵m1;
常数矩阵m2;
//初始m1和m2
m1+m2;
但是,当我试图编译上面的代码时,我得到了以下错误:
m1+m2中的–运算符+不匹配
将您的代码更改为此(不考虑我认为可能错误的地方,只更改它以使其可编译)
#包括
模板
类矩阵{
公众:
模板
矩阵算子+(常数矩阵&m)常数;
私人:
int x;
int-y;
};
模板
模板
矩阵::运算符+(常数矩阵和)常数{
如果(a!=c | | b!=d){
抛出非法操作{};
}
/*constexpr*/if(!std::is_same::value){
抛出错误{};
}
归还*这个;
}
int main(){
常数矩阵m1{};
常数矩阵m2{};
m1+m2;
返回0;
}
我在这里做了一些改变
运算符+
是const
,您试图调用const对象上的非const成员函数,但该函数无效.cpp
文件中定义运算符+
,它必须放在头文件中(如果要拆分接口和实现,最好是)public
部分,因为它能让读者更好地了解类的接口李>
将您的代码更改为此(不考虑我认为可能错误的地方,只更改它以使其可编译)
#包括
模板
类矩阵{
公众:
模板
矩阵算子+(常数矩阵&m)常数;
私人:
int x;
int-y;
};
模板
模板
矩阵::运算符+(常数矩阵和)常数{
如果(a!=c | | b!=d){
抛出非法操作{};
}
/*constexpr*/if(!std::is_same::value){
抛出错误{};
}
归还*这个;
}
int main(){
常数矩阵m1{};
常数矩阵m2{};
m1+m2;
返回0;
}
我在这里做了一些改变
运算符+
是const
,您试图调用const对象上的非const成员函数,但该函数无效.cpp
文件中定义运算符+
,它必须放在头文件中(如果要拆分接口和实现,最好是)public
部分,因为它能让读者更好地了解类的接口李>
您希望
operator+
能够只添加相同大小的矩阵,但使用Matrix
作为其参数会自相矛盾,其中c
和d
可能分别不等于a
和b
。除此之外,您当前存在的错误,您应该知道@ForceBru,我并没有自相矛盾,但我希望在运行时而不是编译时显示错误。我想让代码编译,然后告诉我错误。“我想让错误在运行时显示,而不是在编译时显示”然后不要将矩阵大小作为模板参数。@Loay“我认为在我的情况下,应该将实现分开。”好吧,这根本不起作用:-p您希望操作符+
能够只添加相同大小的矩阵,但使用矩阵
作为参数与您自己相矛盾,其中c
和d
可能分别不等于a
和b
。除此之外,您当前存在的错误,您应该知道@ForceBru,我并没有自相矛盾,但我希望在运行时而不是编译时显示错误。我想让代码编译,然后告诉我错误。“我想让错误在运行时显示,而不是在编译时显示”然后不要将矩阵大小作为模板参数。@Loay“我认为在我的情况下,应该将实现分开。”好吧,这根本不起作用:-p当T和T2是不同类型时,您会怎么做?@n.m.您的意思是在操作符+
成员中?你能澄清一下吗?是的,例如,当你添加矩阵
和矩阵
时会发生什么?返回*这个
会编译,但是实际添加的内容呢?@n.m.'_(ツ)_/“'OP在编译代码时遇到了问题,这是我解决的问题。但是我可以想象一个合适的场景,例如,如果您有int
和short
。OP以后必须向该模板添加约束,如果它们想要更一般化。@不愿意您检查,但如果并且只有我这样做,您应该这样做。”f这在作业中明确说明。否则,从内部模板中完全删除T2参数。当T和T2是不同类型时,您会怎么做?@n.m.您的意思是在运算符+
成员中?您能澄清一下吗?是的,例如,当您添加矩阵和矩阵时会发生什么?返回*这个代码>woul
template<class T,int a,int b>
template<T,int c,int d>
Matrix<T,a,b> Matrix<T,a,b>::operator+(const Matrix<T,c,d> m){
if(a!=c || b!=d) throw IllegalOperation();
// add matrices and return the result
}
const Matrix<int, 3, 2> m1;
const Matrix<int, 7, 3> m2;
// init m1 and m2
m1+m2;
const Matrix<int, 3, 2> m1;
const Matrix<int, 3, 2> m2;
// init m1 and m2
m1+m2;
#include <type_traits>
template <typename T,int a,int b>
class Matrix {
public:
template<typename T2, int c, int d>
Matrix<T,a,b> operator+(const Matrix<T2, c, d>& m) const;
private:
int x;
int y;
};
template <typename T,int a,int b>
template <typename T2, int c, int d>
Matrix<T, a, b> Matrix<T, a, b>::operator+(const Matrix<T2, c, d>&) const {
if(a != c || b != d) {
throw IllegalOperation{};
}
/*constexpr*/ if (!std::is_same<T, T2>::value) {
throw Error{};
}
return *this;
}
int main() {
const Matrix<int, 3, 2> m1{};
const Matrix<int, 7, 3> m2{};
m1 + m2;
return 0;
}