从非模板基类派生模板类

4
我尝试让派生类从基类继承:
class Base
{
public:
    Base() {};
};

template <class T>
class Derived : public Base
{
public:
    Derived::Derived()
    {

    }
};

这使我得到以下错误:
错误 C3254:“Derived”: 类包含显式重写“{ctor}”,但未继承包含该函数声明的接口
注释:参见正在编译的类模板实例化“Derived”
错误 C3244: 'Derived::Derived(void)':此方法是由“Unknown>”而不是“Base”引入的。
我完全不懂模板,我错过了什么简单的步骤吗?这似乎是一个非常基本的事情。

1
你在使用模板时,即使没有继承,这段代码出现的错误与没有使用模板时出现的错误相似。顺便说一下,我对错误消息的前半部分感到有些困惑,这是否确实是导致该错误消息的代码? - 463035818_is_not_a_number
是的,确切代码中出现了真正的错误。 - Jeffrey
哪个编译器?别误会,我只是好奇,不是在抱怨 ;) - 463035818_is_not_a_number
@formerlyknownas_463035818 VS PRO 2017 15.9.11 - Jeffrey
1
有趣的是,一个简单的打字错误竟然会导致如此令人困惑的错误信息。顺便说一句,gcc的输出可能更有帮助 - 463035818_is_not_a_number
Base 本身是一个模板并且依赖于 T 时请小心。 - Evg
1个回答

9
你需要省略 "Derived::" 前缀。你只有在引用继承或注入到类 Derived 命名空间的符号时才会使用它。所以这里唯一有意义的前缀是 "Base::",与模板无关。
class Base
{
public:
    Base() {};
};

template <class T>
class Derived : public Base
{
public:
    Derived() {}
};

可以查看一个实际运行的演示


哦,那是一个非常愚蠢的疏忽。编译器输出的诊断信息真是毫无用处。 不过还是谢谢! - Jeffrey
@Jeffrey 或者接受答案,这样其他人也可以得到帮助。 - Ted Lyngmo
回答了我的问题 - 真遗憾实际问题不够普遍,因为一开始我没有使用模板而错过了它。正如你所说,这个问题与模板无关。 - Phil Rosenberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接