2015-03-21 3 views
1

Рассмотрим этот кусок кодаОшибки компиляции при использовании shared_ptr с enable_shared_from_this на лязгом ++

#include <memory> 

class FooBar : public std::enable_shared_from_this<FooBar>{}; 
typedef std::shared_ptr<const FooBar> ConstantPointer; 

int main() 
{ 
    ConstantPointer p(new FooBar()); 
    return 0; 
} 

На г ++ версии 4.7.4 компилируется без проблем при использовании -std = C++ 11 вариант

на лязгом версии ++ компании Apple LLVM версии 6,0 (звон-600.0.57) (на основе LLVM 3.5svn)

он генерирует следующую ошибку компиляции

In file included from main.cpp:1: 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:4013:35: error: no viable overloaded '=' 
       __e->__weak_this_ = *this; 
       ~~~~~~~~~~~~~~~~~^~~~~~ 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:4050:5: note: in instantiation of function template specialization 
     'std::__1::shared_ptr<const FooBar>::__enable_weak_this<FooBar>' requested here 
    __enable_weak_this(__p); 
    ^
main.cpp:8:20: note: in instantiation of function template specialization 'std::__1::shared_ptr<const FooBar>::shared_ptr<FooBar, void>' requested here 
    ConstantPointer p(new FooBar()); 
       ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:4942:15: note: candidate function not viable: no known conversion from 
     'std::__1::shared_ptr<const FooBar>' to 'const std::__1::weak_ptr<FooBar>' for 1st argument 
    weak_ptr& operator=(weak_ptr const& __r) _NOEXCEPT; 
      ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:4949:9: note: candidate template ignored: could not match 'weak_ptr' against 'shared_ptr' 
     operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT; 
     ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:4967:13: note: candidate template ignored: disabled by 'enable_if' [with _Yp = const FooBar] 
      is_convertible<_Yp*, element_type*>::value, 

Мой вопрос в том, что это ошибка компилятора или не подтверждающий код?

+0

Почему вы используете const в typedef? Я думаю, typedef std :: shared_ptr ConstantPointer; могут быть скомпилированы. –

+0

Это самый простой случай, с которым я мог бы уменьшить свою проблему. Константа может быть неактуальна в прилагаемом коде, но необходима в действительности. –

ответ

1

Во-первых, clang 3.5.0 (а не Apple) компилирует ваш пример, поэтому, похоже, проблема связана с вашей конкретной версией или установкой clang.

Во-вторых, я считаю, что ваш пример хорошо сформировавшимися и хорошо определены, так как стандарт не определяет точный тип параметра из владеющему shared_ptr экземпляра (p в вашем примере):

[util.smartptr. Enab]/7

shared_ptr<T> shared_from_this(); 
shared_ptr<T const> shared_from_this() const; 

Требуется:enable_shared_from_this<T> должен быть доступен базовый класс T. *this должен быть подобъектом объекта t типа T. Должно быть не менее одного shared_ptr экземпляра p, которому принадлежит &t.

Смежные вопросы