我想知道是否有人可以解释以下错误的含义:
代码
#include "sstream"
std::stringstream h;
h.str(""); //clearing the stringstream object
int main()
错误
kial.cpp:5:1: 错误:'h' 没有命名类型 h.str("");
另外,为什么尝试访问 main() 之外的方法是错误的?
我想知道是否有人可以解释以下错误的含义:
代码
#include "sstream"
std::stringstream h;
h.str(""); //clearing the stringstream object
int main()
错误
kial.cpp:5:1: 错误:'h' 没有命名类型 h.str("");
另外,为什么尝试访问 main() 之外的方法是错误的?
好的,所以每个人都带着一个简单的声明来到这里,说你不能这样做。没有人相信。事实上,你可以。但不像你试图这样做。通常,您不能在其他函数之外拥有诸如函数调用之类的语句。并且第一个被调用的函数总是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
希望能帮助到你。祝你好运!
编译器假设您尝试进行声明(或定义),因为在全局范围内不允许使用一般语句。
为什么不允许这样做的简短答案是标准是这样说的。
要考虑为什么这是答案,请考虑您希望代码何时执行。给定已经定义的程序执行顺序,在全局(或命名空间)范围内调用函数意味着什么?
如果您确实需要在该范围内执行某些操作,则始终可以使用类的实例,该类的构造函数可以执行您想要的操作。