Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为模板类声明模板方法_C++_Templates_Matrix - Fatal编程技术网

C++ 为模板类声明模板方法

C++ 为模板类声明模板方法,c++,templates,matrix,C++,Templates,Matrix,我试图在一个模板类上声明一个模板方法,但它对我不起作用。 最好通过给出代码进行解释,如下所示: 我有这门课: 矩阵h 模板 类矩阵{ 私人: int x; int-y; 公众: 类非法操作(); 模板 矩阵算子+(常数矩阵m); //... } matrix.cpp 模板 模板 矩阵::运算符+(常数矩阵m){ 如果(a!=c | | b!=d)抛出非法操作(); //添加矩阵并返回结果 } 我希望这段代码适用于任意两种类型的矩阵以及a、b、c和d可以不同的矩阵。 例如,我希望此代码编译并返

我试图在一个模板类上声明一个模板方法,但它对我不起作用。 最好通过给出代码进行解释,如下所示: 我有这门课:

矩阵h

模板
类矩阵{
私人:
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;
    }