c++ - 以 weak_ptr 作为参数的函数重载决议

标签 c++ c++11 smart-pointers static-cast weak-ptr

我有:

class A : public std::enable_shared_from_this<A>
{...};

class B : public A
{...}; 

void doCoolStuff(std::weak_ptr<A> obj)
{...}

void doCoolStuff(std::weak_ptr<B> obj)
{
 ...
 doCoolStuff(std::static_pointer_cast<A>(obj.lock())); (1)
}

然后在B函数中:

void B::doReallyCoolStuff()
{
 doCoolStuff(std::static_pointer_cast<B>(shared_from_this())); (2)
}

所以问题是:

  1. 编译器错误:错误 C2440:“static_cast”:无法从“B *const”转换为“A *”
  2. 编译器错误:错误 C2668:对重载函数的调用不明确

我不明白如何解决它们中的任何一个,因为:

  1. 我认为它与 shared_from_this 有某种联系,因为这是常量指针。但是我不知道没有const_cast怎么处理这种情况。
  2. 我不知道函数是否可以被不同类型的弱指针重载。

构建环境:MSVS 2013 express

请帮忙。谢谢

最佳答案

至于问题(2),你当然可以这样重载。但问题是您正在调用类型为 std::shared_ptr<B> 的函数.这需要隐式转换为 std::weak_ptr , 它可以同时转换为 std::weak_ptr<A>std::weak_ptr<B> .这两个都是由 std::weak_ptr 中的隐式转换构造函数实现的,这意味着它们中没有一个比另一个更好。因此存在歧义。

要解决这个问题,您可以明确指定类型:

void B::doReallyCoolStuff()
{
    doCoolStuff(std::weak_ptr<B>(std::static_pointer_cast<B>(shared_from_this())));
}

Live example

或者,您可以提供 doCoolStuff 的重载服用std::shared_ptr .

如上面的实例所示,我无法重现问题 (1)。

关于c++ - 以 weak_ptr 作为参数的函数重载决议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25885164/

相关文章:

c++ - 最大 Windows 8.1 CPU 使用率 <= 30%

c++ - 将指针的类型作为模板参数传递

c++ - 找到最接近的斐波那契数

c++ - 类型推导模板函数c++

c++ - 绑定(bind)模板化标准库函数

c++ - 使用可变参数 lambda 迭代可变参数函数模板的参数

c++ - 在等号左侧使用右值引用的规则是什么?

c++ - 有实物表现的所有权

c++ - 在公共(public)成员函数中返回私有(private) unique_ptr

c++ - 使用 mem_fun() 作为智能指针的容器