自定义成员检测器中的模糊调用
Ambiguous call in custom member detector
我在自己的成员检测器实现中工作,以提高我的编程技能。下面的代码在g++中可以很好地编译,但是clang++拒绝该代码,错误是:
main.cpp:19:17:注意:候选函数[with U = has_member::HasIt]下面是类 的代码static char check(decltype(U::i)*);
main.cpp:22:16:注:候选函数[with U =has_member:军队):
static int check(U*);
template<typename T>
struct has_member
{
struct Fallback
{
int i;
};
struct HasIt : Fallback, T
{};
template<class U>
static char check( decltype(U::i)* );
template<typename U>
static int check(U*);
static const bool value = sizeof(check<HasIt>( nullptr ) ) == sizeof(int);
};
class Test
{
public:
};
int main()
{
auto v = has_member<Test>::value;
std::cout << std::boolalpha << v;
}
此处为实例
问题是:代码有效吗?如果是,为什么g++接受它?
代码应该有效。我们有两个可行的候选人:
template <class U>
static char check( decltype(U::i)* ); // --> int*
template <class U>
static int check( U* ); // --> HasIt*
nullptr
可转换为两种指针类型,两种转换都不优于另一种,两个候选对象都是函数模板。但前者比后者更专业,所以应该优先考虑。这是一个clang bug。
一个对两个编译器都有效的简单解决方法是将第二个重载改为:
template<typename U>
static int check(...);
因为任何东西都比省略号优先,所以这仍然是一个备用选项,而不必依赖于模板部分排序规则。
此外,由于使用的是c++ 11,因此可以直接使用返回类型:
template<class U>
static std::false_type check( decltype(U::i)* );
template<typename U>
static std::true_type check(...);
using type = decltype(check<HasIt>(nullptr));
static constexpr bool value = type::value;
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 类X有多个默认构造函数和对重载函数的模糊调用
- 对C++基类的模糊函数调用
- C++中的构造函数调用模糊性
- Visual Studio不允许我使用sqrt或floor,对重载函数的模糊调用
- 修复C++多继承模糊调用
- 在Windows上为Matlab构建libspline - 对重载函数'pow'的模糊调用
- Clang模糊调用(int、float、double)
- 对可变模板的调用是模糊的
- 自定义成员检测器中的模糊调用
- Visual Studio 2012中嵌套boost::assign:list_of失效-对重载函数的模糊调用
- 编译boost时的模糊调用.type_erasure与VS 2015社区
- 可变的模糊调用
- 模板函数调用模糊性错误