首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >非常奇怪的过载故障

非常奇怪的过载故障
EN

Stack Overflow用户
提问于 2018-06-04 00:14:09
回答 1查看 728关注 0票数 15

我遇到了一个非常奇怪的过载故障。我能够找出问题所在,但我永远也找不出哪里出了问题。

代码如下所示

代码语言:javascript
复制
#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});
}

在中编译结果

代码语言:javascript
复制
$ 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.

解决这个问题的两件事是:

Removing Foo(size_t n).

  • Changing Bar(const Foo<size_t> &A).

  • to Bar(const Foo<size_t> &A).

构造函数

显然,我想保留所有的功能。那么:哪里出了问题?我该怎么解决它呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-04 00:53:11

出了什么问题?

代码语言:javascript
复制
Bar A({1,2});

可以解释为:

代码语言:javascript
复制
Bar A(Bar{Foo<std::size_t>(1), (bool)2 /*, true*/ });

代码语言:javascript
复制
Bar A(Foo<std::size_t>{1,2} /*, true, true*/);

如此模棱两可的电话。

我该怎么解决它呢?

这取决于您期望的结果,例如,添加explicit可能会有所帮助。

创建explicit Foo(size_t n)将只允许:

代码语言:javascript
复制
Bar A(B{Foo<std::size_t>(1), (bool)2 /*, true*/ });
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50668414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档