此嵌套模板基类是否不明确?
Is this nested template base class ambiguous?
这段代码曾经在Clang 3.8中编译,现在仍然在VS 2017中编译,但在Clang 3.9中开始发出错误。
template <typename D, typename ... I>
struct impl : I ...
{};
template <typename D, typename ... I>
void f(impl<D, I...> const&)
{}
struct A : impl<A> {};
struct B : impl<B, A> {};
int main()
{
f(A());
f(B()); // Error
}
叮当 3.9 说
<source>:15:5: error: no matching function for call to 'f'
f(B());
^
<source>:6:6: note: candidate template ignored: failed template argument deduction
void f(impl<D, I...> const&)
^
所有三个编译器都在运行: https://godbolt.org/g/OKFpPl
我想f(A())
推导出D = A, I... = <>
,f(B())
推导出D = B, I... = A
,然后可以推导出为impl
的实例。我的最终目标是检测impl
参数包中的类型,这些类型本身就是impl
的实例。我这样做的方式是错误的吗?
不确定,但...
您的B
类继承自从impl<A>
继承的impl<B, A>
。
所以B
继承了一对不同的impl<D, I...>
基类,所以类型推导是模棱两可的(D == B
和I... == <A>
或D == A
和I... == <>
)。
所以我认为 clang 3.8 是错误的,而 3.9 是正确的。
我的最终目标是检测 impl 参数包中的类型,这些类型本身就是 impl 的实例。我这样做的方式是错误的吗?
是的,你这样做的方式是错误的(我认为)。
相关文章:
- 检查输入是否不是整数或数字
- Visual C++(VS2017)中用户定义的转换不明确
- 重载类方法的不明确调用
- glibcxx STL 在实现 std::valarray::sum() 时是否不正确?
- 为函数定义符号不明确的指针参数
- 父类的私有函数会导致对具有相同名称和相似参数的子类中的公共函数的不明确调用
- 我是否不正确地集中了这些字符数组?
- 在 C++17 中的命名空间和子命名空间中重载运算符是不明确的
- C++ 编译器错误:P1LinkedList.cpp:145:错误:重载的"to_string(int&)"调用不明确
- 对重载函数find_first_not_of的不明确调用
- 不明确的成员模板查找
- 是否删除导致不明确过载的转换
- 此嵌套模板基类是否不明确?
- 是否有一种方法可以将C 类成员引用到向量而不明确添加它们
- 关于解引用运算符是否在表达式中产生对象对值的定义不明确
- 与auto_ptr声明不同,当unique_ptr声明的模板类型不完整时,它是否是明确定义的?
- 依赖类型不明确的 c++11 可变参数函数模板重载是否不明确
- 调用带有支撑init列表的显式构造函数:是否不明确
- 在重载解析中,选择使用不明确转换序列的函数是否必然会导致调用格式不正确
- 不明确的if和else分支:是否定义了行为