{"id":6093,"date":"2016-11-03T20:13:03","date_gmt":"2016-11-03T11:13:03","guid":{"rendered":"http:\/\/umezawa.dyndns.info\/wordpress\/?p=6093"},"modified":"2016-11-03T20:18:30","modified_gmt":"2016-11-03T11:18:30","slug":"stdenable_shared_from_this-%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9f%e3%82%b3%e3%83%bc%e3%83%89%e3%82%92-centos7-%e4%b8%8a%e3%81%a7-clang-%e3%81%a7%e3%82%b3%e3%83%b3%e3%83%91%e3%82%a4%e3%83%ab%e3%81%99","status":"publish","type":"post","link":"http:\/\/umezawa.dyndns.info\/wordpress\/?p=6093","title":{"rendered":"std::enable_shared_from_this \u3092\u4f7f\u3063\u305f\u30b3\u30fc\u30c9\u3092 CentOS7 \u4e0a\u3067 Clang \u3067\u30b3\u30f3\u30d1\u30a4\u30eb\u3059\u308b\u3068\u30af\u30e9\u30b9\u69cb\u9020\u306b\u3088\u3063\u3066\u306f\u30ea\u30f3\u30af\u30a8\u30e9\u30fc\u306b\u306a\u308b"},"content":{"rendered":"<p>CentOS7 \u3067 EPEL \u7531\u6765\u306e Clang (3.4.2) \u3092\u4f7f\u3063\u3066 <code>std::enable_shared_from_this<\/code> \u3092\u4f7f\u3063\u305f\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u30b3\u30fc\u30c9\u3092\u30b3\u30f3\u30d1\u30a4\u30eb\u3059\u308b\u3068\u3001\u4f55\u6545\u304b\u30ea\u30f3\u30af\u30a8\u30e9\u30fc\u306b\u306a\u308a\u307e\u3059\u3002\uff08\u8981 <code>-std=c++11<\/code>\uff09<\/p>\n<p><!--more--><\/p>\n<blockquote>\n<pre>#include &lt;memory&gt;\r\n\r\nstruct C;\r\n\r\nstruct A : public std::enable_shared_from_this&lt;A&gt; {\r\n        struct B;\r\n        friend struct C;\r\nprivate:\r\n        A() {}\r\npublic:\r\n        static std::shared_ptr&lt;A&gt; createB();\r\n        static std::shared_ptr&lt;A&gt; createC();\r\n        static std::shared_ptr&lt;A&gt; createD();\r\n};\r\n\r\n\/\/ \u30cd\u30b9\u30c8\u30af\u30e9\u30b9\uff08\u30af\u30e9\u30b9\u5185\u30af\u30e9\u30b9\uff09\u3092\u4f7f\u3046\u5834\u5408\r\nstruct A::B : public A {\r\n        B() : A() {}\r\n};\r\n\r\nstd::shared_ptr&lt;A&gt; A::createB()\r\n{\r\n        return std::make_shared&lt;B&gt;(); \/\/ NG\r\n}\r\n\r\n\/\/ \u30d5\u30ec\u30f3\u30c9\u30af\u30e9\u30b9\u3092\u4f7f\u3046\u5834\u5408\r\nstruct C : public A {\r\n        C() : A() {}\r\n};\r\n\r\nstd::shared_ptr&lt;A&gt; A::createC()\r\n{\r\n        return std::make_shared&lt;C&gt;(); \/\/ OK\r\n}\r\n\r\n\/\/ \u30ed\u30fc\u30ab\u30eb\u30af\u30e9\u30b9\uff08\u95a2\u6570\u5185\u30af\u30e9\u30b9\uff09\u3092\u4f7f\u3046\u5834\u5408\r\nstd::shared_ptr&lt;A&gt; A::createD()\r\n{\r\n        struct D : public A {\r\n                D(): A() {}\r\n        };\r\n        return std::make_shared&lt;D&gt;(); \/\/ OK\r\n}\r\n\r\nint main(void)\r\n{\r\n        auto b = A::createB();\r\n        auto c = A::createC();\r\n        auto d = A::createD();\r\n}<\/pre>\n<\/blockquote>\n<blockquote>\n<pre>\/tmp\/enable_make_shared-7126d3.o: In function `std::__shared_ptr&lt;A::B, (__gnu_cxx::_Lock_policy)2&gt;::__shared_ptr&lt;std::allocator&lt;A::B&gt;&gt;(std::_Sp_make_shared_tag, std::allocator&lt;A::B&gt; const&amp;)':\r\nenable_make_shared.cc:(.text._ZNSt12__shared_ptrIN1A1BELN9__gnu_cxx12_Lock_policyE2EEC2ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_[_ZNSt12__shared_ptrIN1A1BELN9__gnu_cxx12_Lock_policyE2EEC2ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_]+0x8b): undefined reference to `void std::__enable_shared_from_this_helper&lt;A, A::B&gt;(std::__shared_count&lt;(__gnu_cxx::_Lock_policy)2&gt; const&amp;, std::enable_shared_from_this&lt;A&gt; const*, A::B const*)'<\/pre>\n<\/blockquote>\n<p>\u3053\u306e\u69cb\u9020\u306f private \u306a\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u3092\u6301\u3064\u30af\u30e9\u30b9\u3092\uff08\u305d\u306e\u30af\u30e9\u30b9\u306e\u4e2d\u3067\uff09 <code>std::make_shared<\/code> \u3092\u4f7f\u3063\u3066\u69cb\u7bc9\u3059\u308b\u969b\u306b\u4f7f\u308f\u308c\u308b\u30d1\u30bf\u30fc\u30f3\u306a\u3093\u3067\u3059\u304c\u3001<code>std::enable_shared_from_this<\/code> \u3068\u7d44\u307f\u5408\u308f\u305b\u308b\u3068\u30af\u30e9\u30b9\u69cb\u9020\u306b\u3088\u3063\u3066\u306f\u4f55\u6545\u304b\u3046\u307e\u304f\u3044\u304d\u307e\u305b\u3093\u3002<\/p>\n<p>\u3082\u3063\u3068\u65b0\u3057\u3044 libstdc++ \u3068 Clang 3.5 \u3068\u306e\u7d44\u307f\u5408\u308f\u305b\u3067\u306f OK \u3089\u3057\u3044\u306e\u3067\u3059\u304c\u3001CentOS7 \u3067 Clang 3.5 \u3092\u30d3\u30eb\u30c9\u3057\u3066\u305d\u308c\u3092\u4f7f\u3063\u3066\u30b3\u30f3\u30d1\u30a4\u30eb\u3059\u308b\u3068\u3084\u3063\u3071\u308a\u30ea\u30f3\u30af\u30a8\u30e9\u30fc\u304c\u51fa\u308b\u306e\u3067\u3001CentOS7 \u306e libstdc++ \u3068 Clang \u3068\u306e\u300c\u76f8\u6027\u304c\u60aa\u3044\u300d\u306e\u3067\u306f\u306a\u3044\u304b\u3068\u63a8\u5bdf\u3057\u3066\u3044\u307e\u3059\u3002\u5177\u4f53\u7684\u306b\u4f55\u304c\u60aa\u3044\u306e\u304b\u307e\u3067\u306f\u30b9\u30ad\u30eb\u4e0d\u8db3\u3067\u8ffd\u3048\u3066\u3044\u307e\u305b\u3093\u304c\u3002<\/p>\n<p>\u3061\u306a\u307f\u306b\u3001\u4e0a\u8a18\u306e\u30ed\u30fc\u30ab\u30eb\u30af\u30e9\u30b9\u3092\u4f7f\u3046\u5834\u5408\u3067\u3059\u304c\u3001CentOS6 \u306e\u6a19\u6e96\u30b3\u30f3\u30d1\u30a4\u30e9\u3067\u3042\u308b GCC 4.4.7 \u306e <code>-std=c++0x<\/code> \u3067\u306f\u4f7f\u3048\u307e\u305b\u3093\uff08<a href=\"https:\/\/gcc.gnu.org\/gcc-4.4\/cxx0x_status.html\">Status of Experimental C++0x Support in GCC 4.4<\/a> \u3067 &#8220;Local and unnamed types as template arguments&#8221; \u304c No \u306a\u306e\u3067\uff09\u3002CentOS6 + GCC 4.4.7 \u3068 CentOS7 Clang 3.4.2 \u306e\u4e21\u65b9\u3092\u5bfe\u8c61\u306b\u3057\u3088\u3046\u3068\u3059\u308b\u3068\u30d5\u30ec\u30f3\u30c9\u30af\u30e9\u30b9\u3092\u4f7f\u3046\u304b <code>#ifdef<\/code> \u3067\u5206\u3051\u308b\u3053\u3068\u306b\u306a\u308a\u307e\u3059\u3002\uff08\u305f\u3060\u3057\u3001\u30d5\u30ec\u30f3\u30c9\u30af\u30e9\u30b9\u3092\u4f7f\u3046\u3068\u30af\u30e9\u30b9\u5916\u304b\u3089\u69cb\u7bc9\u3067\u304d\u308b\u7a74\u304c\u3067\u304d\u3066\u3057\u307e\u3046\u306e\u3067\u30aa\u30b9\u30b9\u30e1\u3067\u304d\u307e\u305b\u3093\uff09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>CentOS7 \u3067 EPEL \u7531\u6765\u306e Clang (3.4.2) \u3092\u4f7f\u3063\u3066 std::enable_shared_from_this \u3092\u4f7f\u3063\u305f\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u30b3\u30fc\u30c9\u3092\u30b3\u30f3\u30d1\u30a4\u30eb\u3059\u308b\u3068\u3001\u4f55\u6545\u304b\u30ea\u30f3\u30af\u30a8\u30e9\u30fc\u306b\u306a\u308a\u307e\u3059\u3002\uff08\u8981 -s [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27],"tags":[],"class_list":["post-6093","post","type-post","status-publish","format-standard","hentry","category-technology"],"_links":{"self":[{"href":"http:\/\/umezawa.dyndns.info\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/6093","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/umezawa.dyndns.info\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/umezawa.dyndns.info\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/umezawa.dyndns.info\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/umezawa.dyndns.info\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6093"}],"version-history":[{"count":5,"href":"http:\/\/umezawa.dyndns.info\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/6093\/revisions"}],"predecessor-version":[{"id":6098,"href":"http:\/\/umezawa.dyndns.info\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/6093\/revisions\/6098"}],"wp:attachment":[{"href":"http:\/\/umezawa.dyndns.info\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6093"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/umezawa.dyndns.info\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6093"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/umezawa.dyndns.info\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6093"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}