以下では、GCC はテンプレート構造体をclass のname
テンプレート メンバー関数と混同しますが、Clang は正常にコンパイルされます ( live example )。name
A
template<typename T>
struct name {};
struct A
{
template<bool B>
void name() { }
};
template<bool B, typename T>
void f(T& x) { x.template name<B>(); }
この例では、関数f
は明らかに type の引数で呼び出されることを意図していますが、それ以外のものである可能性があるため、テンプレート関数のままにする必要があります。A
f
どのコンパイラが正しいかはあまり気にしません。回避策が必要なだけです。
x.template name<B>();
using
メンバー関数を呼び出すには、宣言やその他の明確化の方法がどのように適用されるかわかりません。
編集はい、より明示的な構文を試しました
x.T::template name<B>();
これは機能しますが、本当に醜いです。簡単な構文を機能させる方法はありますか? それ以外の場合は、最初に 2 つの名前のいずれかを変更することをお勧めします...
EDIT2私の元のバージョンは、最も醜いものを必要とf
するユニバーサルリファレンスで動作しますT&&
using X = typename std::remove_reference<T>::type;
x.X::template name<B>();
場合T
は参照です...そして、これはすべて単純な関数呼び出しです。