我有一个问题,在 g++ 4.7 和 g++ 4.8 上创建指向重载函数的函数指针会导致编译错误,但在 g++ 4.4、g++ 4.6 或 clang++ 3.2(可能还有 VS2010)上没有。
在谷歌搜索了一下以找出问题是 g++ 还是我的代码,我仍然无法决定。适用于函数指针转换的重载解决规则与适用于函数调用的重载解决规则是否不同?
这是一个演示该问题的最小化代码:
template < class T >
struct Dummy {
typedef T value_type;
value_type value;
};
template < class T >
typename T::value_type f (const T& x) {
return x.value;
}
template < class T >
T f (Dummy< T > const& x) {
return x.value + 1;
}
int main (int, char**) {
Dummy< int > d = { 1 };
// No ambiguity here
d.value = f(d);
// This is ambiguous for *some* compilers
int (* const f_ptr)(Dummy< int > const&) = f;
return f_ptr( d );
}
clang++ 3.2、g++ 4.4 和 g++ 4.6 编译这个-Wall -pedantic --std=c++98
没有警告。
但是 g++ 4.7 和 g++ 4.8 会给出以下错误消息:
test.cc: In function ‘int main(int, char**)’:
test.cc:15:45: error: converting overloaded function ‘f’ to type ‘int (* const)(const struct Dummy<int>&)’ is ambiguous
test.cc:6:18: error: candidates are: typename T::Type f(const T&) [with T = Dummy<int>; typename T::Type = int]
test.cc:9:3: error: T f(const Dummy<T>&) [with T = int]
这是新版本的 g++ 的问题还是我的代码实际上是错误的?
如果是这样,人们将如何解决这种模棱两可的问题?