有这样的程序:
#include <iostream>
#include <string>
using namespace std;
class test
{
public:
test(std::string s):str(s){};
private:
std::string str;
};
class test1
{
public:
test tst_("Hi");
};
int main()
{
return 1;
}
...为什么我执行
时会得到以下内容g ++ main.cpp
main.cpp:16:12: error: expected identifier before string constant
main.cpp:16:12: error: expected ‘,’ or ‘...’ before string constant
答案 0 :(得分:17)
您无法在声明它的地方初始化tst_。这只能用于静态const基元类型。相反,你需要有test1的构造函数。
编辑:这是ideone.com中的一个工作示例。注意我做了一些更改 - 首先,让测试的构造函数对字符串进行const引用以避免复制更好。第二 - 如果程序成功,你应该返回0而不是1(返回1你在ideone中得到运行时错误)
答案 1 :(得分:1)
还有另一种更简单的方式来做您想做的事:只需将您的语句从 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"};
,其他一切都完全相同。只是为了确认这有效,我添加了一个 cout 来检查它是否正确初始化了 str 变量。我认为这一单行解决方案更优雅(至少对我而言)并且与新标准保持同步。