使用std :: enable_shared_from_this<>编译错误在OS X上

时间:2014-02-16 02:05:27

标签: c++ xcode inheritance c++11 shared-ptr

用户来找我OS X上的编译问题:

http://fpaste.org/77628/39251593/

排除明显之后;使用gcc而不是clang和“正确”的标准库,很明显问题出在std :: enable_shared_from_this<>类声明的一部分

该类本身有

的声明
class Expression : public std::enable_shared_from_this<Expression> {
// ...
};

一些调查显示这可能是Xcode / clang本身的一个问题: https://github.com/kripken/emscripten/issues/270

https://code.google.com/p/alembic/issues/detail?id=315

有人可以证实吗?或者,有没有办法解决这个问题?

代码位于here,其中有问题的文件位于here

编辑:有问题的代码不需要,所以删除了。使用特定提交更新链接(r1047)

1 个答案:

答案 0 :(得分:2)

我相信这是我遇到的libc ++中的一个错误。我不久前提交了一份错误报告(http://llvm.org/bugs/show_bug.cgi?id=18843)。

出现此问题是因为从shared_ptr派生的const个类的某个std::enable_shared_from_this版本被分配了一个指向该类型的非const指针。在libstdc ++中,constweak_ptr中分配给内部std::enable_shared_from_this的函数内部被剥离,但这在libc ++中不会发生。以下代码显示了在当前libc ++下将导致此错误的示例:

struct A : std::enable_shared_from_this<A> {};

int main()
{
  std::shared_ptr<A const> ptr( new A() );
}

您现在可以通过以下方式解决此问题:

std::shared_ptr<A const> ptr( std::const_pointer_cast<A const>( std::shared_ptr<A>( new A() ) ) );

new A()只是您尝试进入shared_ptr的指针。