模板特化语法错误​​?不确定

时间:2013-02-27 18:16:04

标签: c++ templates

我在使用此模板专业化时遇到了一些麻烦。我是这个话题的新手,所以我完全可以选择这种可能性。

我的通用模板运行得很好,但是在尝试为int制定规范时,我不断收到错误“'Matrix'的外部定义与Matrix int>中的任何声明都不匹配。

现在,我认为它们匹配,但显然必定是错误的。你说大师怎么说?另外,不要粗鲁,但是“你实际上应该只使用STL中的X”评论不会有太多帮助,我必须弄明白这一点。干杯!

template<typename T>
class Matrix
{    
public:
    Matrix(int vert, int edge);
    ~Matrix();
    T* & operator[](int index);
    std::ostream& operator<<(std::ostream&);
    Matrix<T> operator*(Matrix<T>);
    int numVerticies();
    int numEdges();
private:
    T** matrix;
    int verticies;
    int edges;
    const int summation(T** mat1, int, Matrix<int> mat2, int, int verts);
};

template<>
class Matrix<int>
{
public:
    Matrix(int vert, int edge);
    ~Matrix();
    int*& operator[](int index);
    std::ostream& operator<<(std::ostream&);
    Matrix<int> operator*(Matrix<int>);
    int numVerticies();
    int numEdges();
private:
    int** matrix;
    int verticies;
    int edges;
    const int summation(int** mat1, int, Matrix<int> mat2, int, int verts);
};

使用包含方法与其他成员一起使用:

template<int>
Matrix<int>::Matrix(int vert, int edge)
{
    matrix = new int* [vert];

    for (int i=0; i<vert; i++) {
        matrix[i] = new int[vert];
    }

    verticies = vert;
    edges = edge;

    for (int i=0; i<vert; i++) {
        for (int j=0; j<vert; j++) {
            matrix[i][j]=0;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

请避免使用template<>前缀:

Matrix<int>::Matrix(int vert, int edge)
{
    matrix = new int* [vert];

    for (int i=0; i<vert; i++) {
        matrix[i] = new int[vert];
    }

    verticies = vert;
    edges = edge;

    for (int i=0; i<vert; i++) {
        for (int j=0; j<vert; j++) {
            matrix[i][j]=0;
        }
    }
}

您正在定义一个显式专用类的构造函数,而不是构造函数的显式特化。同样,避免使用template<>来定义其他成员:

int Matrix<int>::numEdges()
{
    return 0;
}

另请注意,按值返回const的编程习惯可疑:请使用int而不是const int