は、私は次のファイルの束を持っていると仮定しますバージョンのテンプレートクラスを使用して、使いやすさを簡素化します。正しい前方宣言
#pragma once
#include "Generic.h"
#include <string>
#include <map>
typedef GenericMap<std::string, int, std::map> SpecialMap;
Client.h:SpecialMap
を使用し、宣言を前方定義クライアント。
#pragma once
class SpecialMap; // Wrong forward declaration
struct Client {
Client();
SpecialMap* map;
};
Client.cpp:
#include <Client.h>
int main(int argc, char**args) {
Client c;
return 0;
}
GenericMap
何の前方宣言を持っていないテンプレートクラスを表します。クライアントコードはGeneric.h
とSpecial.h
#include "Client.h"
#include "Special.h"
Client::Client()
{
map["343"] = 2;
}
main.cppには知っているかもしれません。一部のユーザーにとっては、完全に特殊化されたバージョンSpecialMap
がGenericMap
であれば十分です。使いやすさのためにtypedef
が使用されています。
Client
は内部でSpecialMap
を使用しますが、ヘッダーファイルはSpecialMap
の前方宣言のみを宣言する必要があります。
残念ながら、以下のファイルはコンパイルされません。どういうわけか、投稿された前方宣言で十分です。正しいものは何ですか?
長いリストは申し訳ありませんが、それは私が考えることができる最も小さな非実用的な例でした。
私は '#pragma once'を推奨しません。移植性のために '#ifndef ... #define ... #endif'パターンを使用してください。 – erip
'typedef'は特殊化を宣言しません。 –
ヒントをありがとう。私の会社はVisual Studioのみを使用しています。移植性の問題はありません。 :-) – Aleph0