放置类构造函数

时间:2017-02-28 10:56:49

标签: c++ c++11 constructor

为什么这段代码不正确?

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);   
};

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

2 个答案:

答案 0 :(得分:1)

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

  

在类中声明的名称的潜在范围不仅包括后面的声明性区域   name的声明点,但也包括所有函数体,默认参数,   异常规范   S,   和   大括号或相等-初始化   该类中的非静态数据成员(包括嵌套中的这些内容)   类)。

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

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

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

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

但是你的例子不起作用,因为我引用的段落没有涵盖这种decltype的位置,因此名称info2被认为超出了范围。

答案 1 :(得分:0)

QSharedPointer的地方info2;

很重要。 &#39; INFO2&#39;应该在将它用于decltype(http://en.cppreference.com/w/cpp/language/decltype)之前定义。

接下来也不行:

$start = new DateTime($giris);
$end = new DateTime($cikis);
$interval = DateInterval::createFromDateString('1 day');
$period = new DatePeriod($start, $interval, $end);
foreach ($period as $dt) {
    $datex = $dt->format("Y-m-d"). PHP_EOL;
    $sorgu = mysql_query("SELECT * FROM takvimler WHERE `date`='$datex'"); 
    $veri = mysql_fetch_assoc($sorgu);
    $don = $veri['price'];
    echo $don;
}