为什么这不能工作时,分割成2行

Why does this not work when split onto 2 lines?

本文关键字:分割 2行 不能 工作 为什么      更新时间:2023-10-16

这一行:

std::auto_ptr<Ogre::Root> lRoot (new Ogre::Root(lConfigFileName, lPluginsFileName, lLogFileName));

工作好。但是,当我这样做时,它不会:

std::auto_ptr<Ogre::Root> lRoot;
lRoot (new Ogre::Root(lConfigFileName, lPluginsFileName, lLogFileName));

报告:error: no match for call to ‘(std::auto_ptr<Ogre::Root>) (Ogre::Root*)’就我有限的理解而言,它们不应该做同样的事情吗?还是我错过了什么重要的东西?

这两个片段之间没有什么关系。

第一个声明并初始化变量lRoot,没有什么可看的。

第二个代码片段在第一行声明并默认初始化lRoot,但随后它继续使用Ogre::root*类型的参数在lRoot上调用operator()。由于std::auto_ptr没有定义operator(),编译器产生给定的错误

第一条语句是变量lRoot的初始化声明(使用括号内初始化器的语法)。

第二个是声明默认初始化的变量lRoot,然后在该变量上调用operator()。(注意std::auto_ptr没有定义这样的操作符)。

要将其分成两行(仍然作为一条语句),只需在允许空白的地方插入换行符:

std::auto_ptr<Ogre::Root> lRoot(
  new Ogre::Root(lConfigFileName, lPluginsFileName, lLogFileName));

要将其实际拆分为声明和赋值(注意,拆分时不能是初始化),您可以这样做:

std::auto_ptr<Ogre::Root> lRoot;
lRoot.reset(new Ogre::Root(lConfigFileName, lPluginsFileName, lLogFileName));

它们不是一回事!

你不只是把语句分成两行。这两个是两个不同的语句。

你可以像这样把第一个语句分成两行:

std::auto_ptr<Ogre::Root> lRoot
    (new Ogre::Root(lConfigFileName, lPluginsFileName, lLogFileName));

它可以很好地编译,因为多个空格被忽略了