しばらくこのようなコードを使用してきた(以降GCC 4.9/3.5クラン少なくとも):現在のクラスで利用可能なオーバーロードに基づいてSFINAEへの道はありますか?
R
でない限り、第二
bar()
過負荷の点は、それが離れてSFINAE'dされるべきさ
#include <utility>
class foo
{
public:
void bar(int n);
template <typename R,
typename = decltype(std::declval<foo>().bar(*std::begin(std::declval<R>())))>
void bar(const R& range);
};
その要素にはbar()
の過負荷が存在する範囲タイプです。したがってstd::vector<int>
は問題ありませんが、std::vector<int*>
はそうではありません。
は残念ながら、クラン3.9以降、それはこのエラーを与える:
templ.cpp:12:54: error: member access into incomplete type 'foo'
typename = decltype(std::declval<foo>().bar(*std::begin(std::declval<R>())))>
^
templ.cpp:6:7: note: definition of 'foo' is not complete until the closing '}'
class foo
^
1 error generated.
は、独自の定義の中から、不完全な型を使用してに依存しない、これを達成する方法はありますか?
クラスは関数のデフォルト引数内で完全なので、SFINAEをデフォルト引数を持つ関数パラメータに移動できます。 – bogdan
目標は、そのテンプレートをあまりにも積極的に一致させることを止めることでした。具体的な例として 'std :: string'は' char'sのコンテナですが、 'char'のオーバーロードがないので、テンプレートはスキップされ、代わりに' string_view'オーバーロードが選択されます。 SFINAEがなければ、テンプレートを選択してからエラーになります。 –
'std :: vector>'が正しく動作しますか?次に、あなたは '*'が欠けているように見えます。 –
Yakk