放置类构造函数[重复]

Posted

技术标签:

【中文标题】放置类构造函数[重复]【英文标题】: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 eel.is/c++draft/basic.lookup.unqual#7 @PiotrSkotnicki 或者它没有。或者标准没有涵盖它,这是一个不太可能的疏忽,但我找不到在使用前需要定义的声明。虽然有一段话说decltype 操作数类型不必是完整的。这里的问题是有意义的参考,还是缺少参考。 @PiotrSkotnicki 如果我有参考资料,我会回答而不是留下以“也许”开头的评论。 【参考方案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 不起作用?

以上是关于放置类构造函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个构造函数调用 C++ 类构造函数 [重复]

如何从同一个类中的另一个构造函数调用抽象类的构造函数(方法重载)[重复]

在派生构造函数中的某些代码块之后调用派生类中的基类构造函数[重复]

字符串类构造函数安全[重复]

在其派生类C++的构造函数中调用基类的构造函数[重复]

内部类的公共构造函数是啥意思[重复]