web-dev-qa-db-ja.com

ネストされた名前指定子

私は次のようなコードを持っています:

namespace mymap {
    template <class Key,template <typename T > class Allocator> myownmap {
        typedef pair<const unsigned int, Key> typename _myPair;
        typedef multimap<unsigned int, Key,less<Key> ,Allocator<_myPair> > typename _entriesType;
    }
}

これはMSVCで正常にコンパイル(および動作)しますが、gccは無効な構文について文句を言っています。

.hpp:20: error: expected nested-name-specifier before ‘_myPair’
.hpp:20: error: two or more data types in declaration of ‘_myPair’

私は何を間違っているのですか?

18
akashihi

typenameは必要ないため、許可されていません。

MSVCはテンプレートが実際に使用されるまでテンプレートを正しく解析しないため、一部のエラーは後で見つかるまで見つかりません。

25
Bo Persson

「期待されるネストされた名前指定子」とは、typenameキーワードの後に​​、テンプレートパラメータのネストされた名前を使用することが期待されることを意味します(例:typedef typename Key::iterator ...)。あなたの場合、typenameを使用する必要はありません。

6
typedef pair<const unsigned int, Key> /*typename*/ _myPair;
                                      ^^^^^^^^^^^^ not needed

gcc-4.5の出力はこちら を参照してください。 (myownmapclassまたは関数である場合に当てはまります)

4
iammilind