2017-02-09 8 views
0

私は次のコードを持っている:コンストラクタエラー:エラー:予想「」または「...」数値定数の前に

#include <memory> 
#include <functional> 
#include <string> 
#include <unordered_map> 

typedef std::shared_ptr<std::string> StrPtr; 
auto hash1 = [](const StrPtr ptr) { return std::hash<std::string>()(*ptr); }; 

... 

class Actor { 

    ... 

    private: 
     std::unordered_multimap<StrPtr,StrPtr,decltype(hash1)> set(250000,hash1); 
    ... 
}; 

を、私はそれをコンパイルしたい場合は、私は次のエラーを取得する:

Actor.hpp:15:68: error: expected identifier before numeric constant 
    std::unordered_multimap<StrPtr,StrPtr,decltype(hash1)> set(250000,hash1); 
                   ^
Actor.hpp:15:68: error: expected ‘,’ or ‘...’ before numeric constant 

unordered_multimapのコンストラクタ定義を見ると、私の初期化と矛盾していないようです。ここでの問題は何ですか? gccでコンパイル

私は4.8

+3

IIRCの場合、インライン初期化を行うには、 '{}'の中括弧を使用する必要があります。また、GCC 4.8は古く、C++ 11のすべてをサポートしていないので、インライン初期化をまったくサポートしていない可能性があることに注意してください。 –

+1

コンパイラは、あなたがメンバ関数を宣言していると思っているので非常に混乱していると思います。 – molbdnilo

+0

'gcc version 5.3.1'を使うと同じ結果が得られます。それでも私はなぜこれが有効な構文ではないのか分かりません – FloriHe

答えて

1

正規括弧はに許可されていない初期化子をブレース、または-等しいです。

std::unordered_multimap<StrPtr,StrPtr,decltype(hash1)> set{250000,hash1}; 

この制限は、関数宣言で括弧を使用する場合に発生するあいまいさを防ぎます。

+0

それは "うまくいきました"。しかし警告が出ます: '警告: 'Actor'フィールドにはActor :: setというフィールドがあり、そのタイプは私が理解していない匿名の名前空間 class Actor'を使用しています。ところで、関数内の正規のかっこで初期化を使用することは可能ですか?私はもともとこの例を本の中で見たので、そこでは通常の括弧で囲まれた構造が関数の中で使われていました。 – FloriHe

+0

正しい。正規括弧は、ローカル変数を初期化するときには使用できますが、ブレースまたはイコールイニシャライザでは使用できません。あなたが新しい問題を抱えていてそれを解決できない場合は、[mcve] – user2079303

+0

で新しい質問を投稿してください。別の質問を投稿すると、upvotedにならないので、私の質問はあまりにも早すぎます。 – FloriHe

関連する問題