3

コーナーケースに遭遇し、回避策を探しています。コンパイラのバグであるとほぼ確信しており、何も思いつきませんでした。オプションでメンバー関数へのポインターを必要とするクラスがあります。オプションにするために、デフォルト値を nullptr にしました。無関係な変更を加えるまでは機能していました。ビジュアルスタジオでは、「無効なテンプレート引数、コンパイル時の定数が必要です」が発生するようになりました。それはまだGCCで動作します。作業ケースは次のとおりです。

template<class Key_, 
         class Value_, 
         Key_ (Value_::*KeyFn_)() const = nullptr, 
         template <class ...> class Map_ = std::map>
class Hashmap { ... }

動かないケースはこちら

template<class Key_, 
         class Value_, 
         Key_ (Value_::*KeyFn_)() const = nullptr, 
         template <class ...> class Map_ = std::map, 
         class Comparator_=std::less<Key_>>
class Hashmap { ... }

何らかの理由で、キーの取得を型から分割できないため、コンストラクターで keyfn を提供したくなるかもしれませんが、それは不可能です。2 番目のバージョンは、KeyFn_ が nullptr (または 0) の場合にのみ失敗します。クラスメンバーを指定すると、問題なくコンパイルされます。

完全なソース コードも利用できます。

http://sourceforge.net/p/gorgon-ge/code/ci/gscript/tree/

作業リビジョン:

http://sourceforge.net/p/gorgon-ge/code/ci/77d287af75c2301fce55ab97ba49362f7ef6d9e0/tree/

回避策、またはまったく機能しない場合の説明を探しています。

4

0 に答える 0