C++ VC++;14指向成员的指针和指向成员的指针函数之间的模板歧义
我对使用vs14编译器的函数模板有问题。 下面的代码演示了这个问题C++ VC++;14指向成员的指针和指向成员的指针函数之间的模板歧义,c++,c++14,C++,C++14,我对使用vs14编译器的函数模板有问题。 下面的代码演示了这个问题 #include <iostream> using namespace std; class Class { public: int memberFoo() { return 0; } }; template <class VariableT, class C> void nothing(const VariableT C::*memberV) { cout &
#include <iostream>
using namespace std;
class Class {
public:
int memberFoo() {
return 0;
}
};
template <class VariableT, class C>
void nothing(const VariableT C::*memberV) {
cout << "Pointer to member variable";
}
template <class R, class C>
void nothing(R (C::*memberF)()) {
cout << "Pointer to member function";
}
int main() {
nothing(&Class::memberFoo);
return 0;
}
#包括
使用名称空间std;
班级{
公众:
int memberFoo(){
返回0;
}
};
模板
无效(常量变量C::*memberV){
cout您可以通过使用一些方便的类型特征来修复它,并且:
实现在处理这个示例时会有所不同
事实上,您注意到删除常量也消除了歧义。您的输出不是指向成员函数的指针吗?啊,GCC似乎很好地接受了这段代码,但Clang抱怨道。编译器推断:无效(VariableT(u thiscall Class::*))“
出于好奇,如果你从函数重载中删除*
,问题会消失吗?请你解释一下为什么clang和vc++都推断出[VariableT=int()]
?这在我看来很尴尬。@T.C.有一个DR,这就解释了。非常感谢。
template <class R, class C>
void nothing(R (C::*memberF)())
{
std::cout << "Pointer to function" << std::endl;
}
template <class VariableT, class C>
auto nothing(const VariableT C::* memberV)-> typename std::enable_if<std::is_member_object_pointer<decltype(memberV)>::value>::type
{
cout << "Pointer to member variable";
}
void foo(){}
template<class T>
void deduce(const T*) { }
int main() {
deduce(foo);
}