考虑这个包含成员函数和成员函数模板的类模板的示例,它们都被命名为f
,然后尝试定义和专门化成员函数模板:
template<typename T>
struct A {
void f();
template<typename U>
void f();
};
template<>
template<typename U>
void A<double>::f() { }
template<>
template<>
void A<double>::f<int>() { }
这合法吗?成员函数模板定义应如何编写?
在f
的第一个定义中,模板声明是否确保应选择成员函数模板f
而不是成员函数f
,即使没有出现模板参数在类型?我看不出有什么方法可以进一步消除歧义,因为编写::template f()
,::f<U>()
,::f<>()
或其组合似乎无济于事。
编译器结果:
f<int>
的特殊化下由于堆栈跟踪而崩溃f
的第一个定义处出现编译错误(关于定义f
的歧义)相比之下,每个编译器在名称空间范围都接受等效项:
namespace X {
void f();
template<typename T>
void f();
}
template<typename T>
void X::f() { }
template<>
void X::f<int>() { }