我想知道是否有人可以解释以下错误的含义:
CODE
#include "sstream"
std::stringstream h;
h.str(""); //clearing the stringstream object
int main()
错误
kial.cpp:5:1:错误:'h'没有命名类型h.str(“”);
另外,为什么尝试访问main()的方法?
是错误的答案 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)
编译器假设您尝试进行声明(或定义),因为在全局范围内不允许使用通用语句。
为什么不允许这样做的简短答案是标准这样说。
要想一想为什么这就是答案,请考虑何时可以执行代码。在给定已经定义的程序执行顺序的情况下,在全局(或命名空间)范围内调用函数意味着什么?
如果您确实需要在该范围内执行某些操作,则可以始终使用其构造函数执行所需操作的类的实例。