存在同名成员函数时成员函数模板的类定义超出范围-编译器差异

时间:2019-05-29 13:44:07

标签: c++ templates overloading language-lawyer ambiguous

考虑这个包含成员函数和成员函数模板的类模板的示例,它们都被命名为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<>()或其组合似乎无济于事。

编译器结果:

  • clang:在f<int>的特殊化下由于堆栈跟踪而崩溃
  • Visual Studio:成功编译
  • gcc:在f的第一个定义处出现编译错误(关于定义f的歧义)
  • EDG:编译成功

相比之下,每个编译器在名称空间范围都接受等效项:

namespace X {
    void f();
    template<typename T>
    void f();
}
template<typename T>
void X::f() { }
template<>
void X::f<int>() { }

0 个答案:

没有答案