【问题标题】:Constructor for a no-named struct无名结构的构造函数
【发布时间】:2010-10-05 15:10:52
【问题描述】:

我有一个类似的课程:

template <class T>
class bag
{
public:

private:
 typedef struct{void* prev; struct{T item; unsigned int count;} body; void* next;}* node; 
 typedef struct{
  node operator->() { return current; }
  operator(){;} // <- i can not do that, right?

 private:
  node current;
 } iterator;
//...
};

那么,如何为 bag::iterator 编写构造函数?

【问题讨论】:

  • 一个“无名”结构被称为匿名。
  • @Peter G.:不是匿名的,这是“在 typedef 声明中定义的未命名类”7.1.3/5
  • 谢谢 Cubbi,我的立场是正确的。

标签: c++


【解决方案1】:

给它起个好听的名字:-)

typedef struct NoName1 {void* prev; NoName1(){}; struct NoName2{T item; unsigned int count; NoName2() {}} body; void* next;}* node;

编辑:大声笑对不起,写错了,但原理是一样的:-)

【讨论】:

    【解决方案2】:

    bag::iterator没有办法写构造函数,因为iterator是typedef名称,禁止用作构造函数名称:

    14882:2003 12.1/3

    命名类的typedef-name不应用作构造函数声明的声明符中的标识符。

    标准中甚至还有一个示例,尽管在不同的段落中,7.1.3/5:

    typedef struct {
        S();         //error: requires a return type because S is
                     // an ordinary member function, not a constructor
    } S;
    

    如果你想要一个用户定义的构造函数,你必须给那个结构一个名字。无论如何,C++ 风格指南通常不鼓励 typedef struct { } name; 编程风格,而支持 struct name { };。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 2010-10-06
      • 1970-01-01
      • 2012-02-27
      • 2017-07-17
      相关资源
      最近更新 更多