【问题标题】:GCC_VERSION gcc-6.2.0 is given error: enable_if is not a class template but same code is working with gcc-4.3.0GCC_VERSION gcc-6.2.0 出现错误:enable_if 不是类模板,但相同的代码正在使用 gcc-4.3.0
【发布时间】:2019-04-05 16:10:27
【问题描述】:

使用 GCC_VERSION gcc-6.2.0 出现以下错误,但使用 gcc-4.3.0 的代码相同:

char_traits.h:27:8: 错误: enable_if 不是类模板

struct enable_if<true, T> { typedef T type;};

char_traits.h:27:25: 错误:用 1 个模板参数重新声明

struct enable_if<true, T> { typedef T type; };

char_traits.h:24:8: 注意:上一个 声明模板 struct enable_if used 2 模板参数struct enable_if {};

char_traits.h:32:22: 错误:enable_if 之前的预期嵌套名称说明符 typedef typename enable_if&lt;sizeof (T) == sizeof (char)&gt;::type eif;

template<bool B, class T = void>
struct enable_if {};

template<class T>
struct enable_if<true, T> { typedef T type; };

template<typename T>
struct is_char
{
    typedef typename enable_if<sizeof (T) == sizeof (char)>::type eif;
};

您能帮忙解决这些错误吗?

【问题讨论】:

  • 您可以用标准的 std::enable_if<:is_same char>::value>::type 替换您的条件,如果条件失败,则返回的类型必须是 void 类型.:
  • gcc 4.3.0 早于 C++11。 gcc 6.2.0 大约可以追溯到 2016 年。2011 年的 C++ 标准引入了std::enable_if。您的代码声明了名称 enable_if 并且可能在文件范围内也具有 using namespace std 有效。这将解释错误。将您的 enable_if 重命名为不冲突的其他名称,或从您的所有代码中删除 using namespace std。最好两者都有。

标签: c++


【解决方案1】:

这些错误很可能是因为您有一个using namespace std; at file scope

由于using 声明,代码中的模板enable_if 与拉入的std::enable_if 冲突。

此冲突仅发生在 GCC 6.2.0 中,因为此版本支持 C++11,当时 std::enable_if 被添加到该语言中。

GCC 4.3.0 不会发生此冲突,因为此版本不支持 C++11 并且没有 std::enable_if 的实现。

所以摆脱文件范围和全局using 声明,这也将是compile with GCC 6.2.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多