コーナーケースに遭遇し、回避策を探しています。コンパイラのバグであるとほぼ確信しており、何も思いつきませんでした。オプションでメンバー関数へのポインターを必要とするクラスがあります。オプションにするために、デフォルト値を 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/
回避策、またはまったく機能しない場合の説明を探しています。