【问题标题】:Difference between struct and class when Template meta-programming模板元编程时结构和类的区别
【发布时间】:2012-03-30 04:22:42
【问题描述】:
template<int n>
struct Numberim{
     enum{ value = Numberim<n-1>::value + n };
};

template<>
struct Numberim<0>{
     enum{ value = 0 };
};

这是一个简单的tmp示例,没关系;

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

template<>
class Numberim<0>{
     enum{ value = 0 };
};

我使用 g++ 编译,它抱怨...但是,据我所知,结构和类的处理方式几乎相同。就像这样“在 C++ 中,结构和类之间的唯一区别就是struct成员默认是public,class成员默认是private。”

那么,它们在地球上的区别是什么?

【问题讨论】:

  • it complains.- 它是怎么抱怨的?
  • 你认为有什么不同?
  • @Jesse g++ 像这样说“错误:'Numberim:: Numberim::value' 是私有的”,嗯......我想我很天真问这个问题。谢谢。
  • @stuser974349:答案就在你的问题中:class members are private by default,我不明白你的困惑。 @josephthomas:你的意思可能是 class's 而不是 struct's
  • stuser974349:这是因为结构体默认是公开的。请看我的回答。

标签: c++ class templates struct


【解决方案1】:

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

关于类和结构的区别的参考,请参阅What are the differences between struct and class in C++

【讨论】:

    【解决方案2】:

    具体类Numberim&lt;1&gt;与具体类Numberim&lt;0&gt;无关。

    因此,当valuepublic(适用于struct)时,让一个类引用另一个类的value 定义有效,但当valueprivate 时无效,它是对于class

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

    template<int n>
    class Numberim{
        enum{ value = n*(n+1)/2 };
        // And whatever else you want in here. 
    };
    

    【讨论】:

      【解决方案3】:

      区别还是一样的,当它尝试用n=1 编译Numberim&lt;n-1&gt;::value 时,它会尝试使用模板特化。但是,由于valueNumberim&lt;0&gt;private 成员(因为类成员变量默认为private),因此会导致编译器错误。

      【讨论】:

        猜你喜欢
        • 2011-01-11
        • 1970-01-01
        • 1970-01-01
        • 2022-01-03
        • 1970-01-01
        • 1970-01-01
        • 2010-12-27
        • 1970-01-01
        相关资源
        最近更新 更多