Рассмотрим этот кусок кодаОшибки компиляции при использовании 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,
Мой вопрос в том, что это ошибка компилятора или не подтверждающий код?
Почему вы используете const в typedef? Я думаю, typedef std :: shared_ptr ConstantPointer; могут быть скомпилированы. –
Это самый простой случай, с которым я мог бы уменьшить свою проблему. Константа может быть неактуальна в прилагаемом коде, но необходима в действительности. –