Недопустимый вызов нестатической функции-члена при множественном наследовании шаблонов в C ++ - PullRequest
0 голосов
/ 04 июля 2019

У меня есть хост с 2 политиками, каждая из которых имеет функцию print. Если я звоню Policy::print(), проблем нет, но если я звоню OtherPolicy::print(), я получаю сообщение об ошибке.

Error   C2352    'OtherPolicy<T,Host<T,SubPolicy,OtherPolicy>>::printer': illegal call of non-static member function
        with
        [
            T=uint32_t
        ]   Scratch D:\tmp\ScratchCpp\Scratch\Scratch\HostPolicy.h  63  
#include <iostream>

template<
    typename T,
    class Host
>
class Policy {
public:
    virtual void printer()
    {
        std::cout << "base policy" << std::endl;
    }
};

template<
    typename T,
    class Host
>
class SubPolicy : Policy<T, Host> {
public:
    void printer() override
    {
        auto host = static_cast<Host&>(*this);
        std::cout << "sub policy" << std::endl;
    }
};

template<
    typename T,
    class Host
>
class OtherPolicy {
public:
    void printer()
    {
        auto host = static_cast<Host&>(*this);
        std::cout << "other policy" << std::endl;
    }
};

template<
    typename T,
    template<typename, class> class A,
    template<typename, class> class B
>
class Host :
    public A<T, Host<T, A, B>>,
    public B<T, Host<T, Policy, B>> {
public:
    void printer()
    {
        std::cout << "host" << std::endl;
        A<T, Host>::printer();
        B<T, Host>::printer(); // comment out this line to compile successfully
    }
};

int main(int argc, char **argv)
{
    Host<uint32_t, SubPolicy, OtherPolicy> host;
    host.printer();
}

Будет ли кто-нибудь так любезно объяснить, что происходит и как это сделать правильно?

1 Ответ

2 голосов
/ 04 июля 2019

Второй базовый класс для Host имеет тип B<T, Host<T, Policy, B>>, , а не B<T, Host>.Это приводит к ошибке, поскольку B<T, Host> не является базовым классом Host.

. Исправление заключается в правильном названии типа базового класса:

B<T, Host<T, Policy, B>>::printer();
...