2016-07-25 20 views
1

std::mapを定義するクラスを作成しようとしています。マップのコンパレータは関数ポインタでなければなりません。関数のポインタは、クラスのコンストラクタの引数としてクラスに渡すことができます。変数には定義されていてもクラス型はありません

#include <iostream> 
#include <map> 
#include <string> 
#include <functional> 

typedef std::function<bool(std::string x, std::string y)> StrComparatorFn; 

bool FnComparator(std::string x, std::string y) { 
    return strtoul(x.c_str(), NULL, 0) < strtoul(y.c_str(), NULL, 0); 
} 

class MyClass { 
public: 
    MyClass(StrComparatorFn fptr):fn_ptr(fptr){}; 

    void Insert() { 
    my_map.insert(std::pair<std::string, std::string>("1", "one")); 
    my_map.insert(std::pair<std::string, std::string>("2", "two")); 
    my_map.insert(std::pair<std::string, std::string>("10", "ten")); 
    } 

    void Display() { 
    for (auto& it : my_map) { 
     std::cout << it.first.c_str() << "\t => " << it.second.c_str() << "\n"; 
    } 
    } 
private: 
    StrComparatorFn fn_ptr; 
    std::map<std::string, std::string, StrComparatorFn> my_map(StrComparatorFn(fn_ptr)); 
}; 

int main() { 
    MyClass c1(&FnComparator); 
    c1.Insert(); 
    c1.Display(); 
} 

私はInsertでコンパイルエラーを取得しています:

error: '((MyClass*)this)->MyClass::my_map' does not have class type 
my_map.insert(std::pair<std::string, std::string>("1", "one")); 

この問題の解決策どれ

以下は、私が書いたコードはありますか?

std::map<std::string, std::string, StrComparatorFn> my_map(StrComparatorFn(fn_ptr)); 

を並べる

答えて

2

は最も厄介な解析として知られている問題があります。基本的には、機能として解釈することができるすべてのものは、次のようになります。

Foo f(); //f is a function! Not a variable 

あなたのケースでは、my_mapを定義せずに宣言された関数として解析されます。曲線の中括弧の代わりに中括弧を使用すると、リストの初期化を決して関数として解釈できないため、この問題は解決します。

std::map<std::string, std::string, StrComparatorFn> my_map{ StrComparatorFn(fn_ptr) }; 
+0

ありがとうございます。魅力的な作品! – VinK

関連する問題