c++ forward declare partial specialization multiple times给予error in gcc

gcuhipw9  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(93)

在我的游戏引擎的类中,我使用一个宏来为我的成员变量创建Meta数据。(见下面的例子)。为了专门化结构,我必须声明基本Meta数据结构,当我使用Meta数据结构的forward声明继承一个类时,(仅在gcc版本11以上)。我希望这个例子能澄清我的问题。我现在的问题是,gcc在这里是正确的还是编译器错误。如果是这样,有人能提供一个解决方案吗?

// Example for METADATA macro, real macro is more complex, but you get the idea.
#define METADATA(type,val,...) \
template<typename field_index, typename... avoid_explicit_specialization> \
struct field_data; \
template<typename... avoid_explicit_specialization>   \
struct field_data<std::integral_constant<size_t, __COUNTER__>, avoid_explicit_specialization...>{ /* meta infos */ };

struct Base
{ 
    template<typename field_index, typename... avoid_explicit_specialization>
    struct field_data;

    //template<typename... avoid_explicit_specialization>   
    //struct field_data<std::integral_constant<size_t, 0>, avoid_explicit_specialization...>{ /* meta infos */ };

    // METADATA(int, var0)
    // METADATA(int, var1)
};
struct Derived : Base
{ 
    template<typename field_index, typename... avoid_explicit_specialization>
    struct field_data; // ok

    //template<typename... avoid_explicit_specialization>   
    //struct field_data<std::integral_constant<size_t, 0>, avoid_explicit_specialization...>{ /* meta infos */ };

    template<typename field_index, typename... avoid_explicit_specialization>
    struct field_data; // error 

    //template<typename... avoid_explicit_specialization>   
    //struct field_data<std::integral_constant<size_t, 1>, avoid_explicit_specialization...>{ /* meta infos */ };
};

字符串
目标:创建一个没有错误的Meta系统。

8fsztsew

8fsztsew1#

这里的gcc是正确的还是编译器的错误。
该程序是病态的作为每类..一般和 *gcc是正确的,在给出诊断(在这种情况下拒绝)的代码 *:
一个成员不能在成员规范中声明两次,除非

  • 嵌套类或成员类模板可以先声明,然后再定义,
  • 枚举可以用opaque-enum-declaration来引入,然后用opaque-enum-specifier来重新声明。

正如你从上面的引用中看到的,我们不允许在 member-specification 中声明两次成员类模板。

相关问题