gpt4 book ai didi

c++ - XCode 4.5.2 的 CRTP 错误 - 解析问题,预期的表达式

转载 作者:太空宇宙 更新时间:2023-11-04 11:27:08 24 4
gpt4 key购买 nike

我正在使用 CRTP实现一些东西,但在 XCode 4.5.2 中遇到错误。下面的代码是一个简化版本,仍然复制错误。它出现在方法Api::Enable定义的那一行,与Api::Enable调用时没有参数有关this->T::Enable

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 compiler 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;
}

最佳答案

你应该使用 template用于解析依赖模板名称的关键字:

template <Enum E, bool On> void Enable() {
static_cast<T*>(this)->template Enable<E, On>();
}

C++11,[temp.names]/4 :

When the name of a member template specialization appears after . or -> in a postfix-expression or after a nested-name-specifier in a qualified-id, and the object expression of the postfix-expression is type-dependent or the nested-name-specifier in the qualified-id refers to a dependent type, but the name is not a member of the current instantiation (14.6.2.1), the member template name must be prefixed by the keyword template. Otherwise the name is assumed to name a non-template.

如果Enable()例如 template <typename T> void Enable(){} ,然后 clang 显示错误:error: use 'template' keyword to treat 'Enable' as a dependent template name .

我不知道为什么它会在您的情况下产生不相关的消息(当模板参数不是类型时)。我认为这可以作为错误报告发布。 (我在 clang 3.6 上测试过 - 相同)。

此外,gcc 4.8 和 4.9 不会在此代码上产生任何错误,我认为这也是不正确的。

关于c++ - XCode 4.5.2 的 CRTP 错误 - 解析问题,预期的表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26265618/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com