非常奇怪的过载失败
Very strange overload failure
我遇到了一个非常奇怪的过载故障。我能够隔离问题,但我无法终生弄清楚出了什么问题。
代码如下
#include <vector>
#include <iostream>
template<class X>
class Foo
{
public:
Foo(const std::initializer_list<X> &A){}
Foo(size_t n){}
};
class Bar
{
public:
Bar() = default;
Bar(const Foo<size_t> &A, bool a=true, bool b=true){};
};
int main()
{
Bar A({1,2});
}
编译结果
$ clang++ -std=c++14 so.cpp
so.cpp:21:11: error: call to constructor of 'Bar' is ambiguous
Bar A({1,2});
^ ~~~~~
so.cpp:12:11: note: candidate is the implicit move constructor
class Bar
^
so.cpp:12:11: note: candidate is the implicit copy constructor
so.cpp:16:7: note: candidate constructor
Bar(const Foo<size_t> &A, bool a=true, bool b=true){};
^
1 error generated.
解决问题的两件事是:
- 删除
Foo(size_t n)
. - 将构造函数更改为
Bar(const Foo<size_t> &A)
。
显然,我想保留所有功能。那么:出了什么问题?我该如何解决?
出了什么问题?
Bar A({1,2});
可以解释为:
Bar A(Bar{Foo<std::size_t>(1), (bool)2 /*, true*/ });
或
Bar A(Foo<std::size_t>{1,2} /*, true, true*/);
如此模棱两可的呼唤。
我该如何解决?
这取决于您期望的结果,例如,添加explicit
可能会有所帮助。
制作explicit Foo(size_t n)
将只允许:
Bar A(B{Foo<std::size_t>(1), (bool)2 /*, true*/ });
相关文章:
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 非常奇怪的过载失败
- 为什么这个简单的服务器在非常低的并发请求上失败
- 为什么"make distcheck"在这个非常基本的"Hello, World!"自动工具示例中失败?
- 为什么这个非常简单的返回 std::move(线程句柄)失败
- 在NT文件系统上的非常小的文件上FSCTL_GET_RETRIEVAL_POINTERS失败
- 非常简单的编译在Solaris 10上失败
- Getaddrinfo()在失败时返回非常慢