iav*_*avr 7 c++ templates name-conflict template-function
在下面,GCC将模板结构name与name类的模板成员函数混淆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是一个参考...而这一切都是为了一个简单的函数调用.
编辑:正如构造函数和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)