1

私は調査を行いましたが、このメッセージの意味がまったくわかりません。私が見つけたものはすべて、コンパイラ自体のバグのようです。また、「タイプを決定するのに十分なコンテキスト情報がありません」というメッセージは役に立たないこともどこかで読みました。
私の質問: このコンパイル エラー メッセージの意味について誰か情報を持っていますか?
この質問はコード固有のものである可能性があることを理解しています。私のコードは単にグローバルな匿名構造体を宣言しているだけで、関数でそれにアクセスしようとすると、このエラーが発生します (または評価したので)。
編集:コードをコンパイルしました! - しかし、まだエラーの意味がわからないので、質問を開いたままにします。
編集:重要であると思われる限り、これが私のコードです:

    typedef ofstream::pos_type ofilepos;
    struct stack  // stack is my own stack data-structure
    {
      // ...
      // int L; struct N *l;
      stack(): L(0), l(NULL) {}
    }

    // ...

    struct
    {
      const char* zero;
      stack<ofilepos> chunks; // it was 'chunks();' with (), and it didn't work
    } _fileext = {"\0\0\0"};

    // ...

    ofstream& write_stack_pushsize(ofstream& f)
    {
      _fileext.chunks.push(new ofilepos(f.tellp()));
      f.write(_fileext.zero,4);
      return f;
    }

後でではなく、構造体宣言でコンストラクターを呼び出していたことが原因だったのではないかと思います...または何か... C++ 03のバグである可能性があります。

4

1 に答える 1

3

このコードに関しては、

struct
{
  const char* zero;
  stack<ofilepos> chunks();
} _fileext = {"\0\0\0"};

chunks匿名構造体の定義の後にメンバー関数の定義を提供する方法はありません。

以下の使用例も考慮すると、

ofstream& write_stack_pushsize(ofstream& f)
{
  _fileext.chunks.push(new ofilepos(f.tellp()));
  f.write(_fileext.zero,4);
  return f;
}

明らかにchunks、関数メンバーとしてではなく、データ メンバーとして定義するつもりでした。

ちなみに、名前の先頭にアンダースコアを使用すると、標準ライブラリの実装で名前と競合する可能性があります。たとえば、これらの名前はグローバル名前空間で予約されています (私の記憶が正しければ)。通常の規則では、代わりに名前の末尾にアンダースコアを付けて、「メンバー」を示します。

「グローバル」を意味するために、私は単純に名前空間を使用しますg。:-)

于 2012-12-22T06:14:19.707 に答える