0

自動返品タイプのテンプレートを使用しようとしていますが、問題が発生しています。STLマップを受け入れ、マップ内のインデックスへの参照を返す関数を作成したいと思います。正しくコンパイルするために、このコードには何が欠けていますか?

(注:マップは0の整数割り当てで初期化できると想定しています。後で、ブーストコンセプトチェックを追加して、正しく使用されていることを確認します。)

template <typename MapType>
// The next line causes the error: "expected initializer"
auto FindOrInitialize(GroupNumber_t Group, int SymbolRate, int FecRate, MapType Map) -> MapType::mapped_type&
{
    CollectionKey Key(Group, SymbolRate, FecRate);
    auto It = Map.find(Key);
    if(It == Map.end())
        Map[Key] = 0;
    return Map[Key];
}

この関数を呼び出すコードの例は次のとおりです。

auto Entry = FindOrInitialize(Group, SymbolRate, FecRate, StreamBursts);
Entry++;
4

1 に答える 1

2

typename接尾辞の戻り型宣言でMapTypeの前に追加します。

追加するのを忘れると、そのtypenameような種類のエラーが発生します(ここではGCC 4.6.0):

test.cpp:2:28: error: expected type-specifier
test.cpp:2:28: error: expected initializer

それはあなたに次のようなものを与えるでしょう:

template <typename MapType>
auto FindOrInitialize() -> MapType::mapped_type&
{
    ...
}

しかし、あなたがやろうとしていることについては、接尾辞の構文は必要ありません:

template <typename MapType>
typename MapType::mapped_type& FindOrInitialize() 
{
    ...
}

ここで忘れると、typename次のようなエラーが発生します。

test.cpp:2:1: error: need ‘typename’ before ‘MapType::mapped_type’ because ‘MapType’ is a dependent scope

これははるかに明白です!

于 2011-10-11T19:50:00.327 に答える