为什么分成2行时不起作用?

时间:2013-03-04 21:45:54

标签: c++

这一行:

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*)’ 至于我有限的理解不应该这些做同样的事情吗?还是我错过了一些重要的东西?

3 个答案:

答案 0 :(得分:7)

两个片段之间几乎没有关系。

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

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

答案 1 :(得分:6)

第一个语句是带有初始化的变量lRoot的声明(使用括号中的initialiser语法)。

第二个是默认初始化变量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));

答案 2 :(得分:3)

他们不是一回事!

您不只是将声明分成两行。这两个是两个不同的陈述..

您可以将第一个语句拆分为两行,如下所示:

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

它会编译得很好,因为忽略了多个空格。

相关问题