Я использую CRTP для реализации чего-либо, но я застрял на ошибке в XCode 4.5.2. Следующий код представляет собой упрощенную версию, которая все еще реплицирует ошибку. Это происходит на линии, где метод Api::Enable
определен и имеет что-то делать с тем фактом, что не существует никаких параметров при Api::Enable
вызовов this->T::Enable
Ошибка CRTP с XCode 4.5.2 - Parse Issue, ожидаемое выражение
enum Enum
{
FOO,
BAR,
BAZ,
};
template <typename T>
class Api
{
public:
template <Enum E, bool On> void Enable() {static_cast<T *>(this)->Enable<E, On>();}
};
class ApiImpl : public Api<ApiImpl>
{
public:
template <Enum E, bool On> void Enable() {}
};
int main(int argc, const char * argv[])
{
ApiImpl clsApi;
clsApi.Enable<FOO, true>();
return 0;
}
Вот скриншот ошибки в Xcode: http://i.imgur.com/IxEOgQ6.png. Я получаю ту же ошибку, пользуюсь ли я «компилятором Apple LLVM 4.1» или «LLVM GCC 4.2». MSVC Express 2010 компилируется без ошибок.
Обратите внимание, что добавление параметра функции приводит к исчезновению ошибки. Следующие отлично компилируется:
enum Enum
{
FOO,
BAR,
BAZ,
};
template <typename T>
class Api
{
public:
template <Enum E , bool On> void Enable(unsigned int X) {static_cast<T *>(this)->Enable<E, On>(X);}
};
class ApiImpl : public Api<ApiImpl>
{
public:
template <Enum E, bool On> void Enable(unsigned int) {}
};
int main(int argc, const char * argv[])
{
ApiImpl clsApi;
clsApi.Enable<FOO, true>(0);
return 0;
}