3 に答える
2 つのスニペットの間にはほとんど関係がありません。
最初のものは変数を宣言して初期化しますlRoot
が、そこには何も表示されません。
2 番目のスニペットは、最初の行で宣言し、デフォルトで初期化しますが、その後、 type の引数でonlRoot
を呼び出します。は を定義していないため、コンパイラは指定されたエラーを生成します。operator()
lRoot
Ogre::root*
std::auto_ptr
operator()
最初のステートメントは、初期化を伴う変数の宣言ですlRoot
(括弧内に初期化子の構文を使用)。
2つ目は、デフォルトで初期化された変数の宣言でありlRoot
、その後に変数を呼び出しoperator()
ます。(そのstd::auto_ptr
ような演算子を定義しないことに注意してください)。
これを2行に分割するには(まだ1つのステートメントとして)、空白が許可されている場所に改行を挿入できます。
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 行に分割しているだけではありません。2つは2つの異なるステートメントです..
次のように、最初のステートメントを 2 行に分割できます。
std::auto_ptr<Ogre::Root> lRoot
(new Ogre::Root(lConfigFileName, lPluginsFileName, lLogFileName));
複数の空白が無視されるため、問題なくコンパイルされます。