这一行:
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*)’
至于我有限的理解不应该这些做同样的事情吗?还是我错过了一些重要的东西?
答案 0 :(得分:7)
两个片段之间几乎没有关系。
第一个声明并初始化变量lRoot
,没有什么可看的。
第二个代码段在第一行声明并默认初始化lRoot
,然后继续使用lRoot
类型的参数调用Ogre::root*
上的operator()
。由于std::auto_ptr
does not define和operator()
,编译器会产生给定的错误。
答案 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));
它会编译得很好,因为忽略了多个空格。