【发布时间】:2018-06-03 16:14:08
【问题描述】:
我遇到了一个非常奇怪的过载故障。我能够隔离问题,但我无法终其一生找出问题所在。
代码如下
#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)。
显然我想保留所有功能。所以:出了什么问题?我该如何解决?
【问题讨论】:
-
将
explicit添加到您的 Bar ctor 似乎可以解决问题。 -
@Arcinde 非常感谢,这解决了问题。我仍然不清楚为什么在这种情况下需要这样做。
-
试试
Bar A{{1,2}}; -
Bar A{1, 2};编译。但我不确定这是否能满足您的需求。 -
@G_S 它调用了错误的构造函数
标签: c++