Как переслать объявление функции-члена экземпляра шаблона - PullRequest
0 голосов
/ 22 февраля 2019

Интерфейс CRTP с функцией-членом шаблона имеет проблему с вызовом функции-члена шаблона реализации из-за отсутствия предварительного объявления функции-члена шаблона.

Класс IF является интерфейсом, класс Src является реализацией.

    template<class T_Src>
    struct IF {


        template<class T>
        static void f1()
        {
            T_Src::template imp_f1<T>();
        }

template<class T>
    inline void f3()
    {       
        /*this line does not compile*/
        static_cast<T_Src*>(this)->imp_f3<T>();
    }
}


struct Src:public IF<Src>
{
    template<class T>
    static void imp_f1()
    {

    }



    template<class T>
    inline void imp_f3()
    {

    }

};

Работает нормально для реализации интерфейса статической функции, как в IF :: f1

Но для IF :: f3я получаю ошибку MSVC

"C2760: синтаксическая ошибка: неожиданный токен ')", ожидаемое "выражение"

В заключение это работает с глобальными и статическими функциями-шаблонами-членами,но для шаблонных функций члена класса, кажется, требуется предварительное объявление.

Не возражайте против решения, которое включает использование некоторой дополнительной магии шаблона, чтобы обойти эту проблему, такую ​​как это

введите описание ссылки здесь

Однако это исправление связанодля меня это не работа.

В настоящее время я пытаюсь избежать ограничения моего интерфейса CRTP из-за невозможности использования в шаблоне функций экземпляра шаблона.

Cheers

1 Ответ

0 голосов
/ 22 февраля 2019

Вы должны добавить ключевое слово template перед imp_f3<T>(), как вы это сделали для T_Src::template imp_f1<T>():

static_cast<T_Src*>(this)->template imp_f3<T>();

Посмотрите на этот вопрос дляобъяснение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...