Boost智能指针和BOOST_NO_MEMBER_TEMPLATES

5

在一些挣扎后,我成功地将Boost智能指针编译为适用于Windows CE/Mobile的警告级别为4的版本。

我发现消除编译错误和警告的最简单方法是:

#define BOOST_NO_MEMBER_TEMPLATES

这实际上是什么意思?我是否已经把灵魂卖给了魔鬼?当我实际使用这些类型时,会发生什么不好的事情吗?

1个回答

4

本身不会有任何负面影响,只是会丧失一些功能。

成员模板是一个模板成员函数,例如:

struct foo
{
    template <typename T>
    void i_am_not_supported_sometimes(void);
};

为了避免产生未定义的行为或其他问题,您不能以最通用的方式编写程序。我认为确定性的“这样做是否不好”答案取决于它被用于什么以及解决方法是什么。

例如,看一下smart_ptr,没有成员模板版本就是简单地删除成员模板,如下所示:

template<class Y>
explicit shared_ptr( Y * p ): px( p ), pn( p ) // Y must be complete
{
    boost::detail::sp_enable_shared_from_this( this, p, p );
}

Y替换为T,因此您失去了一些自动转换的能力。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接