如何让 boost::make_shared 成为我班上的朋友
我编写了一个带有受保护构造函数的类,因此只能使用静态 create() 函数生成新实例,该函数将共享指针返回到我的类。为了提供有效的分配,我想在 create 函数中使用 boost::make_shared ,但是编译器抱怨我的类构造函数在 boost::make_shared 中受到保护。我决定让我的 boost::make_shared 成为我班上的一个朋友,但我对语法感到困惑。我尝试过
template< class T, class A1, class A2 >
friend boost::shared_ptr<Connection> boost::make_shared(const ConnectionManagerPtr&, const std::string&);
,但编译器给了我语法错误。请帮忙。
I have written a class with protected constructor, so that new instances can only be produced with a static create() function which returns shared_ptr's to my class. To provide efficient allocation I'd like to use boost::make_shared inside the create function, however the compiler complains that my class constructor is protected inside boost::make_shared. I decided to my boost::make_shared a friend of my class but I'm puzzled about the syntax. I tried
template< class T, class A1, class A2 >
friend boost::shared_ptr<Connection> boost::make_shared(const ConnectionManagerPtr&, const std::string&);
but the compiler gived me syntax errors. Please help.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
您不需要模板化
friend
部分,但需要表明friend
函数是一个模板:适用于 Comeau 和当前的 GCC 版本,但不适用于 VC 。更好的是以下形式:
现在可以跨多个编译器工作 - 我在 VC8、VC10、GCC 4.2、GCC 4.5 和 Comeau 4.3 上测试了它。
或者使用限定名称来引用函数模板的特定实例,就像 Martin 应该工作并且在 Comeau 中所做的那样,但 GCC 对此感到窒息。
一个有用的替代方案,不依赖于 make_shared() 的实现细节(因此也适用于 VC10s TR1 实现)是使用 pass-key-idiom 用于构造函数的访问保护并与
create()
函数成为朋友相反,例如:You don't need to template the
friend
part, but you need to signify that thefriend
function is a template:That works with Comeau and current GCC versions but fails with VC. Better would be the following form:
That works across multiple compilers now - i tested it on VC8, VC10, GCC 4.2, GCC 4.5 and Comeau 4.3.
Alternatively using a qualified name to refer to a particular instance of the function template as Martin does should work and does with Comeau, but GCC chokes on it.
A useful alternative that doesn't depend on the implementation details of
make_shared()
(and thus also works with VC10s TR1 implementation) is to use the pass-key-idiom for access-protection of the constructor and to befriend thecreate()
function instead, e.g.:我会尝试不使用
template
部分。毕竟,您希望(模板)函数的特定实例成为您的类的朋友,不是吗? 有效吗?
如果这不是解决方案,向我们提供您收到的编译器消息可能会有所帮助......
I would try without the
template
part. After all, you want a specific instantiation of the (template) function to be a friend of your class, aren't you? Doeswork?
If that's not the solution, it might be helpful to give us the compiler messages you're getting ...
我认为这不是使用 make_shared 的正确位置。只需使用operator new 构造对象并将指针传递给shared_ptr 构造函数即可。这样你就不需要和任何人成为朋友。
顺便说一句,为什么模板参数和函数参数的类型不同?
I think that is not the right place to use make_shared. Just construct your object with operator new and pass the pointer to shared_ptr constructor. That way you don't need to be friends with anyone.
BTW, why template arguments and function arguments are of different type?
我最终使用下面的简单解决方案来强制共享所有权。不需要友谊。
I ended up using the below simple solution to enforce shared ownership. No friendship required.
下面是我为您编写的一些宏。在您的情况下,您将使用:
宏定义:
Below are some macros I wrote up to do this for you. In your case, you would use:
Macro definitions:
只是完整版本的总结:
Just a summary of how a complete version may look like: