Хорошо, проблема в том, что инструмент выполняет проверку на определение шаблона, а не на его создание.
Должен быть какой-то способ помочь инструменту понять ситуацию.Наилучшим способом были бы C++2a
концепции, но, скорее всего, инструмент не поддерживает это, и компилятор, вероятно, тоже этого не делает.
Другое решение было бы предоставить static_assert, надеясь, что инструмент поймет, что:
template <typename T>
class UpdateMethod
{
static_assert(std::is_base_of<UpdateMethod<T>, T>::value, "This is CRTP");
protected:
~UpdateMethod() {}
public:
void operator()() const
{
static_cast<const T*>(this)->update();
}
};
Другой способ - использовать SFINAE и сделать оператора доступным при выполнении сеанса:
template <typename T>
class UpdateMethod
{
protected:
~UpdateMethod() {}
public:
typename std::enable_if<std::is_base_of<UpdateMethod<T>, T>::value>::type
operator()() const
{
static_cast<const T*>(this)->update();
}
};
Или использовать оба.
ПопробуйтеЯ надеюсь, что этот инструмент поймет это и перестанет сообщать об ошибке.Если нет, то, IMHO, это ошибка в инструменте.
Кто-то указывает, что этот C ++ 03 должен использоваться.В этом случае вы можете использовать boost
, где это вспомогательные шаблоны enable_if и is_base_of , где изначально определены.