在下文中,GCC 将模板结构与类name
的模板成员函数混淆,而 Clang 编译良好(现场示例):name
A
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>(); }
在此示例中,函数f
显然是要使用类型参数调用的A
,但它可以是其他任何东西,因此f
需要保留模板函数。
我不太在乎哪个编译器是正确的,我只需要一个解决方法,因为我真的不知道除了语法之外的任何语法
x.template name<B>();
调用成员函数,我看不出如何using
应用声明或任何其他消歧方式。
编辑是的,我现在尝试了更明确的语法
x.T::template name<B>();
这有效,但真的很难看。有什么方法可以使简短的语法起作用吗?否则,最好将两个名称之一更改为...
EDIT2我的原始版本f
适用于通用参考T&&
,需要最丑陋的
using X = typename std::remove_reference<T>::type;
x.X::template name<B>();
万一T
是一个参考......而这一切都是为了一个简单的函数调用。