次のサンプルコードがあります。
class Serializable {};
class MyData : public Serializable {};
void GetData( Serializable& ) {}
template<typename T>
void GetData( T& data )
{
std::istringstream s{"test"};
s >> data;
}
int main()
{
MyData d;
GetData(d);
}
(ライブサンプル)
オーバーロード解決規則に基づいて、基本クラスの型が であるため、非テンプレート バージョンを優先する必要がありSerializable
ます。ただし、オーバーロード解決のためにテンプレート バージョンをインスタンス化するときにエラーが発生すると、SFINAE が起動することを期待しています (型に対して >> 演算子が定義されていない場合は考慮されないため)。
テンプレートが使用されないのに、まだ失敗するのはなぜですか?