模板结构和模板成员函数之间的名称冲突

iav*_*avr 7 c++ templates name-conflict template-function

在下面,GCC将模板结构namename类的模板成员函数混淆A,而Clang编译精细(实例):

template<typename T>
struct name {};

struct A
{
    template<bool B>
    void name() { }
};

template<bool B, typename T>
void f(T& x) { x.template name<B>(); }
Run Code Online (Sandbox Code Playgroud)

函数f显然是A在本例中使用类型的参数调用,但它可能是其他任何东西,因此f需要保留模板函数.

我不关心哪个编译器是正确的,我只需要一个解决方法因为我真的不知道除了之外的任何语法

x.template name<B>();
Run Code Online (Sandbox Code Playgroud)

调用成员函数,我看不出using声明或任何其他消除歧义的方式如何适用.

编辑是的,我现在尝试了更明确的语法

x.T::template name<B>();
Run Code Online (Sandbox Code Playgroud)

哪个有效,但真的很难看.有什么办法让简短的语法有效吗?否则,最好将两个名称中的一个更改为......

EDIT2我原来的版本f作品上一个普遍的参考T&&,这需要最丑

using X = typename std::remove_reference<T>::type;
x.X::template name<B>();
Run Code Online (Sandbox Code Playgroud)

以防万一T是一个参考...而这一切都是为了一个简单的函数调用.

Mik*_*eMB 0

编辑:正如构造函数和iavr所指出的,以下是非标准行为:


使用 VS2013 可以实现以下效果:

template<typename T>
struct name {};

struct A
{
    template<bool B>
    void name() {
        std::cout << "A::name() called with B=" << B<< std::endl;
    }
};

template<bool B, typename T>
void f(T& x) { x.name<B>(); }

int main(){
    A a;
    f<true>(a);
}
Run Code Online (Sandbox Code Playgroud)

输出:

 A::name() called with B=1
Run Code Online (Sandbox Code Playgroud)