C++ VC++;14指向成员的指针和指向成员的指针函数之间的模板歧义

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 &

我对使用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 << "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);
}