Интерфейс 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