C++ 模板元编程时struct和class的区别 模板 结构编号{ 枚举{value=Numberim::value+n}; }; 模板 结构编号{ 枚举{value=0}; };

C++ 模板元编程时struct和class的区别 模板 结构编号{ 枚举{value=Numberim::value+n}; }; 模板 结构编号{ 枚举{value=0}; };,c++,class,templates,struct,C++,Class,Templates,Struct,这是一个简单的tmp示例,没有问题 template<int n> struct Numberim{ enum{ value = Numberim<n-1>::value + n }; }; template<> struct Numberim<0>{ enum{ value = 0 }; }; 模板 类号{ 枚举{value=Numberim::value+n}; }; 模板 类号{ 枚举{value=0}; }; 我使

这是一个简单的tmp示例,没有问题

template<int n>
struct Numberim{
     enum{ value = Numberim<n-1>::value + n };
};

template<>
struct Numberim<0>{
     enum{ value = 0 };
};
模板
类号{
枚举{value=Numberim::value+n};
};
模板
类号{
枚举{value=0};
};

我使用G++编译,它抱怨……但是,据我所知,Stutt和CaskRead几乎是以相同的方式处理的。就像这样的“C++中,结构和类之间唯一的区别是默认的结构成员是公共的,而默认的类成员是私有的。”


那么,它们在地球上有什么不同呢

区别将与类与结构的区别相同。您的“值”对于第一个示例(使用struct)是公共的,对于第二个示例(使用class)是私有的


有关类和结构之间差异的参考,请参见。

该差异将与典型的类与结构的差异相同。您的“值”对于第一个示例(使用struct)是公共的,对于第二个示例(使用class)是私有的


有关类和结构之间差异的参考,请参见。

具体类
Numberim
与具体类
Numberim
无关

因此,当
value
public
时,让一个类引用另一个类对
value
的定义是有效的,这是针对
struct
的,但当
value
private
时,这不是针对
类的

您可以使用
friend
机制,也可以将
value
公开,或者更简单地说,您可以这样做:

template<int n>
class Numberim{
     enum{ value = Numberim<n-1>::value + n };
};

template<>
class Numberim<0>{
     enum{ value = 0 };
};
模板
类号{
枚举{value=n*(n+1)/2};
//还有你想在这里干什么。
};

混凝土等级
Numberim
与混凝土等级
Numberim
无关

因此,当
value
public
时,让一个类引用另一个类对
value
的定义是有效的,这是针对
struct
的,但当
value
private
时,这不是针对
类的

您可以使用
friend
机制,也可以将
value
公开,或者更简单地说,您可以这样做:

template<int n>
class Numberim{
     enum{ value = Numberim<n-1>::value + n };
};

template<>
class Numberim<0>{
     enum{ value = 0 };
};
模板
类号{
枚举{value=n*(n+1)/2};
//还有你想在这里干什么。
};

当它尝试使用
n=1
编译
Numberim::value
时,差异仍然相同。但是,由于
value
Numberim
private
成员(默认情况下,类成员变量是
private
),它会给出编译器错误。

当它尝试使用
n=1
编译
Numberim::value
时,差异仍然相同。然而,由于
value
Numberim
private
成员(因为类成员变量默认为
private
),它会给出编译器错误。

它会抱怨。
-它怎么抱怨?你认为有什么区别吗?@Jesse the g++这样说错误:“Numberim::Numberim::value”是私有的“,嗯……我想我问这个问题太天真了。谢谢你。@stuser974349:答案就在你的问题中:
类成员默认是私有的,我不理解这种混乱。”@josephthomas:你可能是指
类的
而不是
结构的
。Stuer974349:那是因为默认情况下结构是公共的。请看我的答案。
它抱怨。
-它抱怨什么?你为什么认为有区别?@Jesse g++这样说:“错误:'Numberim::Numberim::value'是私有的”,嗯……我想我问这个问题太天真了。谢谢。@StUser97439:答案在你的问题中:
类成员默认是私有的,我不理解这种混乱@josephthomas:你可能是指
类的
而不是
结构的
。Stuer974349:那是因为默认情况下结构是公共的。请看我的答案。