あなたが望むことを行うための別のより単純な方法があります:ステートメントを test tst_("Hi");
から変更するだけです test tst_{"Hi"};
まで そしてそれはうまくいくでしょう。以下は変更されたコードで、期待どおりに動作します。
#include <iostream>
#include <string>
using namespace std;
class test
{
public:
test(std::string s):str(s){cout<<"str is: "<<s;}
private:
std::string str;
};
class test1
{
public:
test tst_{"Hi"};
};
int main()
{ test1 obj;
return 0;
}
test tst_("Hi");
を変更したばかりであることに注意してください test tst_{"Hi"};
まで 他のすべてはまったく同じです。これが機能することを確認するために、str変数を正しく初期化することを確認するために1つのcoutを追加しました。この 1 行のソリューションは (少なくとも私にとっては) より洗練されており、新しい標準に対応していると思います。
tst_
を初期化できません 宣言するところ。これは static const
に対してのみ実行できます プリミティブ型。代わりに、class test1
のコンストラクターが必要になります。 .
編集:以下に、私が ideone.com で行った実際の例を示します。私が行ったいくつかの変更に注意してください。まず、コンストラクタは test
のほうがいい const
を取る string
への参照 コピーを避けるために。次に、プログラムが成功した場合は return 0
する必要があります 1
ではない (return 1
の場合) ideone で実行時エラーが発生します)。
#include <iostream>
#include <string>
using namespace std;
class test
{
public:
test(const std::string& s):str(s){};
private:
std::string str;
};
class test1
{
public:
test1() : tst_("Hi") {}
test tst_;
};
int main()
{
return 0;
}