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とグローバル オブジェクトがあります。したがって、上記のルールには例外が 1 つだけあります。それは、グローバル オブジェクトの構築と破棄です。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 に答える