我是计算机图形学硕士学位的最后一年的学生,我们必须使用C++进行练习。

这是代码:
AbsMatrice.h:

#pragma once

template<int M,int N, typename T>
class AbsMatrice
{
private:

T m_data[M][N];

public:
AbsMatrice();
~AbsMatrice();

AbsMatrice<M, N, T> mul(AbsMatrice<M,N,T> &a);
AbsMatrice<M, N, T> add(AbsMatrice<M, N, T> &a);
void read(...);

T& at(int row, int col);
T& operator ()(int row, int col);

//fonction virtuelle pure
virtual void print() = 0;

int& getNumRows(){ return M; }
int& getNumColumns(){ return N; }
};
Matrice.h:
#pragma once
#include "AbsMatrice.h"

template <int M, int N, typename T>

class Matrice : public AbsMatrice<M,N,T>
{

public:
    Matrice();
    ~Matrice();

    void print();
 };
AbsMatrice.cpp:
#include "AbsMatrice.h"
#include <iostream>


template<int M, int N, typename T>
AbsMatrice<M, N, T>::AbsMatrice(){
    for (int i = 0; i < M; i++)
    {
        for (int j = 0; j < N; j++)
        {
            m_data[i][j] = 0;
        }
    }
}

template<int M, int N, typename T>
AbsMatrice<M, N, T>::~AbsMatrice()
{
}

template<int M, int N, typename T>
T& AbsMatrice<M, N, T>::operator ()(int row, int col)
{
    return m_data[row][col];
}

template<int M, int N, typename T>
T& AbsMatrice<M, N, T>::at(int row, int col)
{
    return m_data[row][col];
}

template<int M, int N, typename T>
AbsMatrice<M, N, T> AbsMatrice<M, N, T>::add(AbsMatrice<M, N, T> &a)
{
    if (this->getNumColumns() == a.getNumColumns() && this->getNumRows() == a.getNumRows())
    {
        for (int i = 0; i < M; i++)
        {
            for (int j = 0; j < N; j++)
            {
                m_data[i][j] += a(i, j);
            }
        }
    }
    else
        std::cout << "Erreur matrice de taille différentes !" << std::endl;

    return this;
}

template<int M, int N, typename T>
void AbsMatrice<M, N, T>::print()
{
    std::cout << "la matrice :" << std::endl;
}
Matrice.cpp:
#include "Matrice.h"
#include <iostream>


template <int M, int N, typename T>
Matrice<M,N,T>::~Matrice()
{
}

template <int M, int N, typename T>
void Matrice<M, N, T>::print()
{
    for (int i = 0; i < M; i++)
    {
        for (int j = 0; j < N; j++)
        {
            std::cout << " " << this->m_data[i][j] << " ";
        }
        std::endl;
    }
}

当我尝试这样做主要:
main.cpp:
#include "Matrice.h"


int main()
{
    Matrice<2,2,int> a;
    Matrice<2,2,int> b;

}

我讨厌:
error C2259: 'AbsMatrice<2,2,T>' : cannot instantiate abstract class
1>          with
1>          [
1>              T=int
1>          ]
1>          due to following members:
1>          'void AbsMatrice<2,2,T>::print(void)' : is abstract
1>          with
1>          [
1>              T=int
1>          ]
1>          c:\users\bobmaza\documents\visual studio 2013\projects\tpmatrices\tpmatrices\absmatrice.h(22) : see declaration of 'AbsMatrice<2,2,T>::print'
1>          with
1>          [
1>              T=int
1>          ]

我尝试在网络上的所有位置进行搜索,但是没有找到与我的情况相近的案例,并且大多数人都没有使用相同的签名来覆盖抽象函数,但这不是我的案例。我之前从未见过这样的错误,谢谢。

错误消息的含义是什么,如何纠正?

注意:几年来我一直在用c++进行编码,但从未做过这样的事情,所以我无法弄清楚!

附言:对不起,法国人的名字我是法国的学生。

编辑:感谢大家的帮助,这是我第一次必须在这里询问周围的社区,社区!

最佳答案

编译器会准确地告诉您正在发生的事情-void Matrice<M,N,T>::print()没有声明为virtual,因此导致纯虚拟函数virtual void print() = 0不会被重载。

为了避免将来发生这种情况,请将重载(虚拟)函数指定为override

此外,我假设print函数不修改对象的内部状态并一直工作,因此const noexcept说明符将是适当的。

这是一个片段,可以帮助您进行更安全的虚拟函数重载

class Interface
{
public:
   virtual ~Interface() {}
   virtual void print() const noexcept = 0;
};

class Implementation : public Interface
{
public:
   virtual ~Implementation() {}
   virtual void print() const noexcept override
   {
      ...
   }
};
  • 在重载函数中声明较宽松的throw specifier时,
    错误被触发。
  • 当声明宽松的internal state specifier
    在重载函数中,将引发错误。
  • 当一个overriding函数未覆盖,则引发错误。
  • 关于c++ - C++模板抽象继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33424228/

    10-15 01:31