2013-03-04 25 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