を定義しているが、誰かが私を理解する助けてください、なぜ次のコードはコンパイルされません:ないキャストキャスト演算子は
template< typename T >
class A
{};
template< typename U >
class wrapper
{
public:
// cast operator
operator wrapper< A<void> >()
{
return wrapper< A<void> >{};
}
};
template< typename T >
void foo(wrapper< A<T> >)
{}
int main()
{
foo( wrapper<void>{});
}
エラーメッセージ:
t.cpp:24:7: error: no matching function for call to 'foo'
foo( wrapper<void>{});
^~~
t.cpp:18:10: note: candidate template ignored: could not match 'A<type-parameter-0-0>' against 'void'
void foo(wrapper< A<T> >)
^
1 error generated.
とどのようにそれを修正するの?
wrapper<void>
は、class wrapper
のキャスト演算子を使用してwrapper< A<void >
にキャストされると予想しました。スムーズにコンパイル
int main()
{
foo(static_cast< wrapper< A<void> > >(wrapper<void>{}));
}
を次のように
明示的な静的キャストであるため、テンプレートパラメータの控除には正しいタイプが適用されます。可能性のあるユーザー定義のコンバージョンを考慮したテンプレートパラメータの控除を想定しているようです。 – VTT