2013-03-04 54 views
0

这条线:为什么在拆分为2行时不工作?

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

上次我检查,Ogre有它自己的智能指针类。你为什么不使用它们?无论如何,'auto_ptr'已被弃用。忘掉它。 – n0rd 2013-03-04 21:54:05

+0

这就是OGRE教程告诉我如何做xD的原因,我只是重构了一下代码。 – w4etwetewtwet 2013-03-04 21:55:34

回答

6

第一条语句是变量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)); 
+1

完美的是,它不仅回答了问题,而且提供了一个解决方案,它将尽快接受。 – w4etwetewtwet 2013-03-04 21:54:37

+3

@handuel:未来,如果您*想要*修复,请求它可能会更好。海报不想修复某些问题(例如,有一个明显的解决方法),而是要理解它。 – Jon 2013-03-04 21:56:45

3

他们不是一回事!

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

您可以先声明拆分成两行是这样的:

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

而且由于多个空格都被忽略,将编译就好了。

+0

我如何将它分成两行。 (或者将.h中的声明和.cpp中的构造函数中的初始化) – w4etwetewtwet 2013-03-04 21:49:06

7

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

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

第二片断声明和缺省初始化第一行lRoot,但随后进行到调用上lRootoperator()Ogre::root*类型的参数。由于std::auto_ptrdoes not defineoperator(),编译器会产生给定的错误。

+0

没有提及'operator ='? – 2013-03-04 22:04:23

+0

@MooingDuck:Angew在他的回答中已经提到了'.reset',所以这个基地被覆盖了。我没有,因为这个问题只是问“为什么?”。 – Jon 2013-03-04 22:07:48

+1

他确实只是问为什么,但OP显然不知道他在做什么,需要朝正确的方向推动。 – 2013-03-04 22:31:21