【问题标题】:member initializer 'SuperClass' does not name a non-static data member or base class成员初始值设定项“SuperClass”未命名非静态数据成员或基类
【发布时间】:2016-12-19 15:31:45
【问题描述】:

我的一些构造函数有问题。两个子类都需要获取相同的类(没有超类),这就是为什么这些类应该在超类中初始化:

template<typename T, typename S>   
class SuperClass {
protected:
    OtherClass <T> const& _class1;
    OtherOtherClass <T> const& _class2;

    SuperClass() {

    }

    SuperClass(OtherClass<T> const& class1, OtherOtherClass<T> const& class2)
        : _class1(class1), _class2(class2)
    {
            // Alternative I tried:
            // this->_class1 = class1;
            // this->_class2 = class2;
    }

我尝试通过以下方式使用它:

    template<typename T, typename S> 
    class SubClass1 : public SuperClass<T, S> {
    private:
        someFunc() {
            return this->_class1.getSomething(); // as an example
        }

    public:
        SubClass1(OtherClass<T> const& class1,
                OtherOtherClass<T> const& class2)
                : SuperClass(class1, class2)
            {
                // some definitions
            }

     }

之后出现此错误:

成员初始化器 'SuperClass' 没有命名非静态数据成员或基础 类

我发现一些人有类似的问题,但它并没有引导我找到解决方案。例如:member initializer does not name a non-static data member or base class 我没有看到很多不同之处,并尝试像他一样添加一个空的构造函数。

【问题讨论】:

标签: c++ constructor


【解决方案1】:

错误说明了一切:

成员初始值设定项 'SuperClass' 未命名非静态数据成员或基类

SuperClass 不是一个类。这是一个类模板。因此,它不是您的类型的基类。基类是类模板的特定实例化:SuperClass&lt;T,S&gt;。这就是你需要的:

    SubClass1(OtherClass<T> const& class1,
            OtherOtherClass<T> const& class2)
    : SuperClass<T,S>(class1, class2)
    //          ^^^^^

【讨论】:

  • 作为记录,VC++ 和 Intel 的编译器可以从基类规范 (: public SuperClass&lt;T, S&gt;) 中找出 &lt;T, S&gt;,这对我来说似乎更直观。 GCC 和 Clang 无法做到这一点。不知道哪种行为更符合标准。
猜你喜欢
  • 2013-08-31
  • 1970-01-01
  • 2013-11-12
  • 2020-05-02
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
相关资源
最近更新 更多