在基础抽象 class 中调用在接口中声明为虚拟的函数(并在派生 class 中实现)

Calling function that was declared virtual in interface (and implemented in derived class) inside base abstract class

我有以下继承模型:

   interface      abstract class   concrete derived class
_________________________________________________________
IPriorityQueue -> APriorityQueue -> UnsortedPriorityQueue

我的成员函数在接口中声明为纯虚函数。在摘要 class 中,我想使用 size() 来实现 empty(),因为如果 size = 0,则优先级队列为空。 size() 在派生的 class.

中正确实现
#include <list>

template <typename K, typename V>
class   IPriorityQueue
{
    public:
        virtual int     size(void)  const = 0;
        virtual bool    empty(void) const = 0;
};

template <typename K, typename V>
class   APriorityQueue : virtual public IPriorityQueue<K, V>
{
    public:
        bool    empty(void) const { return (!size()); }
};

template <typename K, typename V>
class   UnsortedPriorityQueue : virtual public APriorityQueue<K, V>
{
    private:
        std::list<V>    _list;
    public:
        int             size(void)  const { return (this->_list.size()); }
};

int main()
{
    UnsortedPriorityQueue<int, char>    test;
}

但是,我收到以下错误:

../../libft/APriorityQueue.hpp:49:37: error: there are no arguments to 'size' that depend on a template parameter, so a declaration of 'size' must be available [-fpermissive]
   bool empty(void) const { return (!size()); }
                                     ^~~~
../../libft/APriorityQueue.hpp:49:37: note: (if you use '-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated)

我在 Whosebug 上的一些其他答案中读到必须指定命名空间,因此我按以下方式对其进行了修改:

        bool    empty(void) const { return (!IPriorityQueue<K, V>::size()); }

但现在我收到链接器错误,抱怨 IPriorityQueue<K, V>::size() 未实现:

main.o:main.cpp:(.text$_ZNK14APriorityQueueIiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE5emptyEv[_ZNK14APriorityQueueIiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE5emptyEv]+0x28): undefined reference to `IPriorityQueue<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::size() const'
collect2.exe: error: ld returned 1 exit status

有什么办法可以解决这个问题吗?这样的设计甚至可能吗?提前谢谢你

只需更换

bool    empty(void) const { return (!size()); }

bool    empty(void) const { return (!this->size()); }//note i have added this->

这将解决您的问题。

这是规则

the compiler does not look in dependent base classes when looking up nondependent names .

Here's 一篇很好的文章,可以阅读更多相关信息。