質問

私が書いたコードには本当に厄介な問題があります。 stackoverflowで同じ問題を抱えている他の人を見つけて、解決策を試しましたが、うまくいきませんでした。

私が使用しているいくつかの一般的なSTLタイプをtypedefしますが、マップをtypedefしようとする場合を除き、他のどれにも問題はありません。 <!> quot; some_file.h:83:エラー:「<!> lt;」の前に初期化子が必要ですtoken <!> quot;テストプログラムにヘッダーを含めるとエラーが発生します。

ヘッダー(some_file.h)の重要な部分は次のとおりです。

#ifndef SOME_FILE_H
#define SOME_FILE_H
// some syntax-correct enums+class prototypes
typedef std::string str;
typedef std::vector<Column> col_vec;
typedef col_vec::iterator col_vec_i;
typedef std::vector<Row> row_vec;
typedef row_vec::iterator row_vec_i;
typedef std::vector<str> str_vec;
typedef str_vec::iterator str_vec_i;
typedef std::vector<Object> obj_vec;
typedef obj_vec::iterator obj_vec_i;
typedef std::map<Column, Object> col_obj_map; // error occurs on this line
typedef std::pair<Column, Object> col_obj_pair;

some_file.cppのインクルードは次のとおりです。

#include <utility>
#include <map>
#include <vector>
#include <iostream>
#include <string>
#include <stdio.h>
#include <cc++/file.h>
#include "some_file.h"

テストファイルには、単純に文字列、ベクター、ファイルがこの順序で含まれています。こんにちは世界のようなことをするメインメソッドがあります。

おもしろいのは、問題がどこにあるかを確認するためにテンプレートクラスをすばやく投げたことです(<!> quot; std::map<Column... <!> quot;を<!> quot; hello<Column... <!> quotに置き換えて;)そして問題なく動作しました。

<」演算子のないクラスを使用している場合、マップに必要な演算子オーバーロードを既に作成しました。

役に立ちましたか?

解決

コンパイラがマップが何であるかを知らないため、この問題が発生しています。マップヘッダーがまだ含まれていないためわかりません。ヘッダーはSTLテンプレートを使用します:string、vector、map、<!> amp;ペア。ただし、それらは定義されておらず、定義されている場所への参照もありません。テストファイルが文字列またはベクトルではなくマップ上にbarfsされる理由は、some_file.hの前に文字列とベクトルヘッダーを含めるため、文字列とベクトルは定義されますが、マップはそうではないためです。マップのヘッダーを含めると機能しますが、ペアについて文句を言う場合があります(特定のSTL実装でマップのヘッダーにペアが含まれていない場合)。

一般に、最良のポリシーは、使用するすべてのタイプに適切な標準ヘッダーを独自のヘッダーに含めることです。したがって、some_file.hには少なくとも次のヘッダーが必要です。

#include <string>
#include <map>
#include <utility> // header for pair
#include <vector>

このアプローチの欠点は、プリプロセッサが毎回各ファイルをロードし、#ifdef ... #endif条件付きインクルード処理を実行する必要があるため、数千のファイルがあり、それぞれに数十のインクルードがある場合ファイルを使用すると、コンパイル時間が大幅に長くなる可能性があります。ただし、ほとんどのプロジェクトでは、ヘッダーのインクルードを手動で管理する必要があるという追加の悪化は、コンパイル時間のわずかな向上に値しません。 そのため、Scott Meyersの Effective STL ブックには<!> quot; Always#適切なヘッダーを含めます! アイテム#48

他のヒント

ヘッダーファイルのどこかに#include <map>がありますか?

少なくともそれが機能するかどうかを確認するためにそこに入れてください。とにかくそうするべきです。

これらのインクルードの一部をヘッダーファイルにシフトする必要があります。これらはtypedefステートメントの前に配置する必要があります。

i.e。

#include <map>
#include <string>
#include <map>

それ以外の場合、some_file.hを含む他のもの(メインプログラムなど)は、#include <!> quot; some_file.h <!> quot;の前にこれらのインクルードを配置しない限り、それらが何であるかを認識しません。メインプログラムのソースファイルにincludeディレクティブ。これを行うと、問題はなくなるはずです。

数人が指摘したように、コンパイラはmapの定義を見つけていません。マップヘッダーが含まれているように見えるので、考えられる他の2つの原因が考えられます。

  1. stdマップヘッダーの代わりに、mapという別のヘッダーファイルがロードされています。これはありそうもないと思います。
  2. 別のヘッダーは、マップを他の何かに#define 'しています。

どちらかをチェックする1つの方法は、コンパイラーに後処理されたファイル、つまりCプリプロセッサーで実行された後、コンパイルされる前のソースファイルを生成させることです。その後、問題のある行を見つけて、マップタイプが他のものに置き換えられたかどうかを確認できるはずです。また、ファイルを検索して、#includeがどのヘッダーに挿入されたかを確認できるはずです。

後処理されたファイルの生成方法はコンパイラに依存します-コンパイラのドキュメントのcmd-lineフラグを確認してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top