- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
除非定义了 B0RKEN(就像命令行上的 -DB0RKEN 一样),否则编译以下内容:
#include <functional>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
using boost::shared_ptr;
using boost::make_shared;
using my_fn = std::function<void()>;
void foo()
{
my_fn fn = [](){};
#ifdef B0RKEN
shared_ptr<my_fn> k = make_shared<my_fn>(fn);
#else
shared_ptr<int> k = make_shared<int>(0);
#endif
}
boost似乎在玩一些有趣的游戏,这可能是这段代码出现这个问题的原因。我不明白的是为什么它适用于 shared_ptr<int>
但不是 shared_ptr<my_fn>
.
我不想争论我应该使用 boost 还是 std 共享指针。
我从 clang++ 得到以下错误:
foo.cpp:15:24: error: call to 'make_shared' is ambiguous
shared_ptr<my_fn> k = make_shared<my_fn>(fn);
^~~~~~~~~~~~~~~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:4670:1: note: candidate function [with _Tp =
std::__1::function<void ()>, _Args = <std::__1::function<void ()> &>]
make_shared(_Args&& ...__args)
^
/opt/local/include/boost/smart_ptr/make_shared_object.hpp:246:87: note: candidate function [with T = std::__1::function<void ()>, Args =
<std::__1::function<void ()> &>]
template< class T, class... Args > typename boost::detail::sp_if_not_array< T >::type make_shared( Args && ... args )
^
1 error generated.
来自 g++:
foo.cpp: In function ‘void foo()’:
foo.cpp:15:45: error: call of overloaded ‘make_shared(my_fn&)’ is ambiguous
shared_ptr<my_fn> k = make_shared<my_fn>(fn);
^
foo.cpp:15:45: note: candidates are:
In file included from PATH_TO_TOOLCHAIN/boost-1.59.0/include/boost/smart_ptr/make_shared.hpp:15:0,
from PATH_TO_TOOLCHAIN/boost-1.59.0/include/boost/make_shared.hpp:15,
from foo.cpp:3:
PATH_TO_TOOLCHAIN/boost-1.59.0/include/boost/smart_ptr/make_shared_object.hpp:246:87: note: typename boost::detail::sp_if_not_array<T>::type boost::make_shared(Args&& ...) [with T = std::function<void()>; Args = {std::function<void()>&}; typename boost::detail::sp_if_not_array<T>::type = boost::shared_ptr<std::function<void()> >]
template< class T, class... Args > typename boost::detail::sp_if_not_array< T >::type make_shared( Args && ... args )
^
In file included from PATH_TO_TOOLCHAIN/gcc-4.9.3/include/c++/4.9.3/memory:82:0,
from PATH_TO_TOOLCHAIN/boost-1.59.0/include/boost/config/no_tr1/memory.hpp:21,
from PATH_TO_TOOLCHAIN/boost-1.59.0/include/boost/smart_ptr/shared_ptr.hpp:23,
from PATH_TO_TOOLCHAIN/boost-1.59.0/include/boost/shared_ptr.hpp:17,
from foo.cpp:2:
PATH_TO_TOOLCHAIN/gcc-4.9.3/include/c++/4.9.3/bits/shared_ptr.h:600:5: note: std::shared_ptr<_Tp1> std::make_shared(_Args&& ...) [with _Tp = std::function<void()>; _Args = {std::function<void()>&}]
make_shared(_Args&&... __args)
^
最佳答案
my_fn
的类型是std::function<void()>;
, 驻留在命名空间 std
.
当您尝试调用 make_shared<my_fn>(fn);
时它通过 ADL 看到 boost 版本(因为你写了 using boost::make_shared;
)和标准版本。
int
不属于std
make_shared
的命名空间和标准版本不考虑。
尽可能使用限定名称来避免此类问题。
关于c++ - 'make_shared' 不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34532709/
我在 boost::asio 中做了一个 echo-server 示例。但是使用 boost::make_shard 会导致“未知异常”,而 std::make_shared 则不会。请参阅注释行。
我一直在做一些现场性能测试 1>std::shared_ptr, std::make_shared based on 'gcc 4.7.2' & 'VC10 implementation' 2>boo
问题 1> Line 1 的使用率真的比 Line 2 好吗? boost::shared_ptr shpStr = boost::make_shared(); // Line 1 boost::sh
正如 Bjarne Stroustrup 的“C++ 之旅”中所述,作为一种已知的 C++14 实践,人们应该避免在代码中使用裸露的 new 和 delete。标准库提供 std::make_shar
这可能是重复的,但我无法在任何地方找到解决方案。 我有这样的源代码: struct Blob{ //... static void *operator new(size_t si
我有一个带有模板构造函数的类,并且想要一个 shared_pointer给它。如: class A; typedef std::shared_ptr A_ptr; class A { public:
将 VS 2015 与 v120 结合使用。 所以我得到了内存异常,因为当我在一个已经构造的对象上调用 make_shared() 时。已经构造的对象有一个指向另一个用 new 分配的对象的指针,所以
在this回答 T.C.州 boost::make_shared etc. support array types - either one of unknown size, or one of fi
虽然我有std::tr1::shared_ptr在我的编译器中可用,我不有make_shared . 谁能告诉我如何正确实现 make_shared ?我懂了我需要使用可变参数来为 T 的构造函数提供
我正在尝试自己实现 shared_ptr。 make_shared 有问题。 std::make_shared 的主要特点是它在连续的内存块中分配计数器 block 和对象。我怎样才能做同样的事情?
除非定义了 B0RKEN(就像命令行上的 -DB0RKEN 一样),否则编译以下内容: #include #include #include using boost::shared_ptr; u
有什么方法可以使用 make_shared 而不是 shared_ptr 作为抽象类型? 例子: #include #include class Foo { public: virtual
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我明白了: shared_ptr x = make_shared(); 效率高于: shared_ptr x(new X()); 而且我了解其中的优势。但是,我不明白为什么编译器不能有这样的规则 "i
使用 gcc 4.6.2,如果构造函数抛出异常,make_shared() 会给出无用的回溯(显然是由于某些重新抛出)。我正在使用 make_shared() 来节省一些输入,但这是显示停止器。我创建
从 C++11 开始,由于多种原因,开发人员倾向于将智能指针类用于动态生命周期对象。对于那些新的智能指针类、标准,甚至建议不要使用像 new 这样的运算符,而是建议使用 make_shared 或 m
从理论上讲,make_shared() 和shared_ptr 之间的一个区别是内存分配技术。 make_shared() 应该使用一个 block ,而 shared_ptr 应该使用两个 bloc
为了规避restriction on partially supplied explicit template arguments ,我将要从中推导出类模板参数 ( Internal ) 的结构嵌
为什么这个 make_shared 在两个单独的调用中分配相同的内存地址? typedef struct { int a; int b; int c; } test_t; vo
我最近正在处理 shared_ptr 的问题。我很好奇如果 make_shared 失败了,它会引发异常吗?是否存在 make_shared 返回 nullptr 但没有任何异常的情况? 最佳答案 来
我是一名优秀的程序员,十分优秀!