错误:'test'的外线定义与'B <dim>'中的任何声明都不匹配

Fah*_*hed 9 c++ macos virtual inheritance templates

我有一个小问题就是杀了我!! 我不知道下面的代码似乎有什么问题.我应该能够实现从超类继承的函数,不应该吗?但我明白了error: out-of-line definition of 'test' does not match any declaration in 'B<dim>'

template <int dim>
class A 
{
public:
  virtual double test() const ;
};

template <int dim>
class B : public A <dim>
{
};

template <int dim>
double B<dim>::test () const
{
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在使用clang(Apple LLVM 5.1版)的Mac上.

πάν*_*ῥεῖ 11

尝试

template <int dim>
class B : public A <dim>
{
public:
     virtual double test () const;
};

// Function definition
template <int dim>
double B<dim>::test () const
{
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

您仍然需要定义声明类声明的函数.

  • 谢谢.我仍然认为C++应该足够聪明,知道该函数被覆盖了. (7认同)
  • 但是不重新声明这个功能会破坏继承的目的吗?我想要一个超类来定义许多子类声明的所有必要函数.我不想再重复这个问题了!另外,你的修复程序不会隐藏A :: test函数吗? (6认同)
  • @FahadAlrashed不!如果你不重新声明它,编译器应该如何知道类'B`提供它自己的实现._'我不想再次重复声明!'_要编写有效的c ++代码,你必须这样做! (2认同)

Vla*_*cow 8

问题是你试图在类 B 的类定义之外定义函数测试。你必须首先在类中声明它

template <int dim>
class B : public A <dim>
{
   double test() const;
};
Run Code Online (Sandbox Code Playgroud)

  • 再说一次..重新声明函数不会违背继承的目的吗?我不明白为什么需要重新声明继承的函数。 (7认同)
  • 如果可以在类外部声明/定义函数的方法以覆盖基本实现,那么谁说它不能完全在其他文件中定义/声明呢?这将是一团糟,因为它会允许在任何地方任意重写方法并导致无法维护的污泥。 (4认同)