18

有这样的程序:

#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
4

2 回答 2

24

您无法tst_在声明它的位置进行初始化。这只能用于static const原始类型。相反,您需要为class test1.

编辑:下面,您将看到我在ideone.com中所做的一个工作示例。请注意我所做的一些更改。首先,最好让构造函数引用到test以避免复制。其次,如果程序成功了,你不应该(在ideone中出现运行时错误)。conststringreturn 01return 1

#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;
}
于 2012-04-07T05:49:28.793 回答
1

还有另一种更简化的方式来做你想做的事:只需将你的语句从test tst_("Hi");to更改为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 变量。我认为这种单线解决方案更优雅(至少对我而言)并且与新标准保持同步。

于 2021-02-21T16:23:46.077 回答