【问题标题】:invalid use of incomplete type / forward declaration of errors. possible missuse of abstract class? (C++)不完整类型的无效使用/错误的前向声明。可能滥用抽象类? (C++)
【发布时间】:2011-12-14 23:34:10
【问题描述】:

现在我得到了错误:

error: ‘oset<std::basic_string<char, std::char_traits<char>, std::allocator<char> >   >::Comparator’ is an inaccessible base of ‘CaseSensitive’

我一直试图找出问题几个小时无济于事,希望你们中的一个可以帮助我。相关代码如下:

template <class T>
class oset;

template <class T>
class oset {

....

 public:
    class Comparator {
 public:
    virtual ~Comparator() {}
    virtual int compare(T, T) = 0;
};

 private:
    Comparator *comp;

....

 public:
    // new empty set:
    oset(Comparator*);
....

};

....

class CaseSensitive : oset<string>::Comparator
{
    public:
        virtual ~CaseSensitive(){}
        virtual int compare(string str1, string str2)
        {
            return strcmp(str1.c_str(), str2.c_str());
        }
};
....

int main() {
    oset<string>::Comparator *cs = new class CaseSensative();
    //error in line above

    ....

}

我要做的是创建一个抽象的 Comparator 对象,以便我可以定义自定义类型顺序来对 oset 进行排序。

谢谢!

【问题讨论】:

    标签: c++ abstract forward-declaration incomplete-type


    【解决方案1】:

    你是从Comparator私下继承的,所以继承关系在类的成员和朋友之外是不可用的。特别是,这会阻止从CaseSensitive*Comparator* 的转换。您可能想公开继承:

    class CaseSensitive : public oset<string>::Comparator // added "public"
    {
        // members here
    };
    

    除非您另外指定,否则class 的成员和基类是privatestructpublic

    【讨论】:

      【解决方案2】:

      它应该是new CaseSensative()(拼写为“敏感”,顺便说一句),并且该类的完整定义必须可用(您很可能没有包含定义它的标题)。

      好吧,或者你定义了一个类并尝试使用不存在的类,在这种情况下它应该是new IgnoreCase()

      【讨论】:

      • 哦,哇哦,这是区分大小写的版本,而不是忽略大小写,让我解决这个问题
      • 所以我添加了区分大小写的代码。事实证明,我在 main 中有一个类型,您指出了这一点。我修复了该类型并得到了一个新错误。我更改了我提供的信息来解决这个问题。
      【解决方案3】:

      您应该在问题中包含 CaseSensative。除非这是问题所在。

      【讨论】:

      • 所以我在我的问题中修正了这个错误,我也有一个类型,现在我的错误如下: error: 'oset<:basic_string std::char_traits>, std::allocator > >::Comparator' 是 'CaseSensitive' 的一个不可访问的基础
      • @GarrettRosenblatt:您需要继承 public -ally 才能使用指向基址的指针。 - 当你私有继承时(默认为类),这意味着这种继承关系只是一个世界其他地方无法知道的实现细节。
      猜你喜欢
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 2014-02-02
      • 2019-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多