调用main()之外的方法是错误的

时间:2013-05-02 01:17:45

标签: c++

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

CODE

    #include "sstream"

    std::stringstream h;

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

    int main()

错误

  

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

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

是错误的

2 个答案:

答案 0 :(得分: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

希望它有所帮助。祝你好运!

答案 1 :(得分:3)

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

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

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

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