2

我想知道是否有人可以解释以下错误的含义:

代码

    #include "sstream"

    std::stringstream h;

    h.str(""); //clearing the stringstream object

    int main()

错误

kial.cpp:5:1: 错误:'h' 没有命名类型 h.str("");

另外,为什么尝试访问 main() 之外的方法是错误的?

4

2 回答 2

8

好的,所以每个人都带着一个简单的声明来到这里,说你不能这样做。没有人相信。事实上,你可以。但不像你试​​图这样做。通常,您不能在其他函数之外拥有诸如函数调用之类的语句。并且第一个被调用的函数总是main. 但是,C++ 具有RAII和全局对象。因此,上述规则只有一个例外——全局对象的构造和销毁。通过使用RAII并声明一些全局对象,您可以调用其构造函数,然后从那里完成其余的工作。因此,例如,您可以像这样解决您的问题:

#include <sstream>
#include <iostream> // just for std::cout and std::endl.

std::stringstream h;

struct MyStruct {
    MyStruct() {
        h.str(""); //clearing the stringstream object
        std::cout << "`h` string stream is cleared now!" << std::endl;
    }
};

MyStruct mystruct;

int main()
{
    std::cout << "I am called AFTER MyStruct's constructor" << std::endl;
}

编译并运行:

$ g++ -Wall -pedantic -std=c++98 ./test.cc  && ./test
`h` string stream is cleared now!
I am called AFTER MyStruct's constructor

希望能帮助到你。祝你好运!

于 2013-05-02T01:26:00.110 回答
3

编译器假设您尝试进行声明(或定义),因为在全局范围内不允许使用一般语句。

为什么不允许这样做的简短答案是标准是这样说的。

要考虑为什么这是答案,请考虑您希望代码何时执行。给定已经定义的程序执行顺序,在全局(或命名空间)范围内调用函数意味着什么?

如果您确实需要在该范围内执行某些操作,则始终可以使用类的实例,该类的构造函数可以执行您想要的操作。

于 2013-05-02T01:23:23.407 回答