【问题标题】:Placing class constructor [duplicate]放置类构造函数[重复]
【发布时间】:2017-02-28 10:56:48
【问题描述】:

为什么这段代码不正确?

class Method
{
public:
   Method(decltype(info2) info1);
   virtual ~Method(){}
protected:
  QSharedPointer<info> info2;
};

但是这段代码是正确的:

class Method
{
public:
   virtual ~Method(){}
protected:
  QSharedPointer<info> info2;
public:
  Method(decltype(info2) info1);   
};

为什么类构造函数的位置很重要? 我认为定义类构造函数的地方并不重要。

【问题讨论】:

  • 也许编译器在你声明之前无法确定info2 的类型
  • @DragonRock 编译器按照标准要求做,你能提供参考吗?
  • @PiotrSkotnicki 或者它没有。或者标准没有涵盖它,这是一个不太可能的疏忽,但我找不到在使用前需要定义的声明。虽然有一段话说decltype 操作数类型不必是完整的。这里的问题是有意义的参考,还是缺少参考。
  • @PiotrSkotnicki 如果我有参考资料,我会回答而不是留下以“也许”开头的评论。

标签: c++ c++11 constructor


【解决方案1】:

我相信这部分标准是相关的[basic.scope.class]/1.1

在类中声明的名称的潜在范围不仅包括紧随其后的声明区域 名称的声明点,还有所有函数体,默认参数, 异常规范 年代, 和 大括号或相等初始化器 该类中的非静态数据成员(包括嵌套中的此类内容) 类)。

请注意,它仅提及 默认 参数。所以这是可行的,因为 decltype 在默认参数中被引用:

Method(QSharedPointer<int> info1 = decltype(info2)())

这也有效,因为它在体内:

Method(<...>)
{
    decltype(info2) info3;
}

但是您的示例不起作用,因为我引用的段落未涵盖这样的 decltype 放置,因此名称 info2 被认为超出范围。

【讨论】:

    【解决方案2】:

    QSharedPointer info2 的位置;

    很重要。 'info2' 应该在使用到 decltype (http://en.cppreference.com/w/cpp/language/decltype) 之前定义。

    下一步也不行:

    void f() {
        d();
    }
    
    void d() {
    }
    

    【讨论】:

    • 但该示例适用于类定义。为什么decltype 不起作用?
    猜你喜欢
    • 1970-01-01
    • 2013-05-30
    • 2011-03-16
    • 2015-12-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    相关资源
    最近更新 更多