在我的游戏引擎的类中,我使用一个宏来为我的成员变量创建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系统。
1条答案
按热度按时间8fsztsew1#
这里的gcc是正确的还是编译器的错误。
该程序是病态的作为每类..一般和 *gcc是正确的,在给出诊断(在这种情况下拒绝)的代码 *:
一个成员不能在成员规范中声明两次,除非
正如你从上面的引用中看到的,我们不允许在 member-specification 中声明两次成员类模板。