【问题标题】:'boost::make_shared' : ambiguous call to overloaded function'boost::make_shared' : 对重载函数的模糊调用
【发布时间】:2011-12-02 12:55:29
【问题描述】:

我有以下类定义:

class Portal
{
   public:

   Portal( const vector<vec3> &vertices, shared_ptr<Sector> target );

   ...
};

在其他地方,我想创建一个这样的类的实例:

auto portal = make_shared<Portal>( portalVertices, target );

但是,我在 Visual Studio 2010 中收到以下错误消息:

错误 C2668: 'boost::make_shared' : 对重载的模糊调用 功能

谁能告诉我为什么?我只定义了一个构造函数。谢谢!

【问题讨论】:

  • 它应该列出候选人是什么。

标签: c++ boost shared-ptr make-shared


【解决方案1】:

当您使用关键字 auto 时,我假设您使用的是 C++11 功能。 C++11 还带有std::make_shared

所以,请尝试添加命名空间:

auto portal = std::make_shared<Portal>( portalVertices, target );

auto portal = boost::make_shared<Portal>( portalVertices, target );

所以我通常在我的代码/.C 文件中做的是:

using namespace std; // this is a "using" directive
....
void somefunction() {
    auto portal = make_shared<Portal>( ... );
}

正如你提到的,你在标题中指定了

using boost::make_shared;

我真的很想看到完整的头文件。因为我认为你实际上想要一个 using 指令,但最终有一个 using 声明。

看看这个描述:

using 指令:http://msdn.microsoft.com/en-us/library/aewtdfs3%28v=vs.80%29.aspx

using 声明:http://msdn.microsoft.com/en-us/library/was37tzw%28v=vs.80%29.aspx

【讨论】:

  • 我做了,但无济于事。我应该指出它与其他类一起工作得很好,并且我在一个公共头文件中声明了以下内容: using boost::shared_ptr;使用 boost::make_shared;
  • 您是否尝试删除 using boost::make_shared 然后在代码中使用 auto portal = boost::make_shared ...?
  • 是的,谢谢! 现在,我可以以某种方式“取消使用”std::make_shared,这样我就不必指定要使用哪个命名空间的模板?另外,我仍然不确定为什么这个课程会发生这种情况,而不是我项目中的其他 +50 课程。它们都共享相同的基本标头。
  • 或者,是否建议只依赖MS的shared_ptr实现?
  • @Vexator:简单:不要使用using namespace std;,尤其是不要在标题中使用。再输入 5 个字符真的很容易,尤其是如果它可以让您免于这样的歧义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 2011-12-12
  • 2014-09-05
  • 2016-03-26
  • 1970-01-01
相关资源
最近更新 更多