以下の文について混乱しています。変換メンバー関数に使用された例は理解していますが、コンストラクターメンバー関数テンプレートの機会を理解していません。Mankarse が提供する役立つ例です。
明示的なテンプレート引数リストは関数テンプレート名の後に続き、変換メンバー関数テンプレートとコンストラクター メンバー関数テンプレートは関数名を使用せずに呼び出されるため、これらの関数テンプレートに明示的なテンプレート引数リストを提供する方法はありません。 --14.5.2.5 N3242
struct A {
template <class T> operator T*();
};
template <class T> A::operator T*(){ return 0; }
template <> A::operator char*(){ return 0; } // specialization
template A::operator void*(); // explicit instantiation
int main()
{
A a;
int *ip;
ip = a.operator int*(); // explicit call to template operator
// A::operator int*()
}
クラス テンプレートのメンバー関数のテンプレート引数は、メンバー関数が呼び出されるオブジェクトの型のテンプレート引数によって決まります。--14.5.1.1.2 N3242
したがって、テンプレート引数を自分で差し引くか、ラッパーを使用する必要があります。
標準ライブラリを読み取るときに libstdc++ によって与えられる例:
template<typename _Container>
class back_insert_iterator
: public iterator<output_iterator_tag, void, void, void, void>
{
protected:
_Container* container;
public:
explicit
back_insert_iterator(_Container& __x) : container(&__x) { }
}
/*
*it use a wrapper :
*/
template<typename _Container>
inline back_insert_iterator<_Container>
back_inserter(_Container& __x)
{ return back_insert_iterator<_Container>(__x); }