我对下面的句子感到困惑,我理解他们用于转换成员函数的示例但不理解构造函数成员函数模板场合,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); }