放置类构造函数[重复]
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
不起作用?以上是关于放置类构造函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何从同一个类中的另一个构造函数调用抽象类的构造函数(方法重载)[重复]