发新话题
打印

I S O C++ / S T L 问题 Faq

I S O C++ / S T L 问题 Faq

此贴内容不是编程精华版内的内容,是我回答一个C++邮件列表内的问题,希望对其他类似问题有启发。
有其他更新将不定期编辑。

问题一:
Q:
复制内容到剪贴板
代码:
#pragma warning (disable: 4786)
#include < map>
#include < algorithm>

typedef std::map< int,void*>  stuff_map;

struct _need_delete {
        bool operator() (const stuff_map::value_type &v) const {
                return true;
        }
};

void test()
{
        stuff_map *sm=new stuff_map;
        std::remove_if(sm-> begin(),sm-> end(),_need_delete());
}

编译出错说 error C2582: 'std::pair< int const ,void *> ' : 'operator =' function is unavailable
:(

为什么 pair 的 operator= 找不到啊. int 和 void* 都是原生类型啊
A:
复制内容到剪贴板
代码:
看 map 内的代码
typedef pair<const _Key, _Tp> value_type;
再看 remove_if 的代码:
return __first == __last ? __first : remove_copy_if(++__i, __last, __first, __pred);
然后再看 remove_copy_if 的代码:
if (!__pred(*__first)) {
   *__result = *__first;
   ++__result;
}
这个时候 * __result  = const int , 无法赋值.
问题二:
Q:
复制内容到剪贴板
代码:
namespace vfx_intimate{
    struct VSelectThen
    {       template<typename Then, typename Else>
            struct Result
            {       typedef Then RET;
            };
    }; // end SelectThen
    struct VSelectElse
    {       template<typename Then, typename Else>
            struct Result
            {       typedef Else RET;
            };
    }; // end SelectElse

    template<bool Condition>
    struct VSelector
    {       typedef VSelectThen RET;
    }; // end Selector

    template<>
    struct VSelector<false>
    {       typedef VSelectElse RET;
    }; // end Selector<false>

        const int DEFAULT = -32767;

        const int NilValue = -32768;

        struct NilCase
        {   enum {tag = NilValue};
                typedef NilCase RET;
        }; // NilCase
}

template<bool Condition, typename Then, typename Else>
struct VIF
{
        typedef typename vfx_intimate::VSelector<Condition>::RET select;
        typedef typename select::Result<Then,Else>::RET RET;
}; // IF

template <int Tag,typename Statement,typename Next = vfx_intimate::NilCase>
struct VCASE
{   enum {tag = Tag};
    typedef Statement statement;
    typedef Next next;
}; // CASE

template <int Tag,typename aCase>
struct VSWITCH
{
        typedef typename aCase::next nextCase;
        enum {
                tag = aCase::tag,                        // VC++ 5.0 doesn't operate directly on aCase::value in IF<>
                nextTag = nextCase::tag,        // Thus we need a little cheat
                found = (tag == Tag || tag == vfx_intimate::DEFAULT)
        };
        typedef typename VIF<(nextTag == vfx_intimate::NilValue),
                                vfx_intimate::NilCase,
                                VSWITCH<Tag,nextCase> >
                        ::RET nextSwitch;
        typedef typename VIF<(found != 0),
                                aCase::statement,
                                nextSwitch::RET>     //编译通不过!!!!
                        ::RET RET;
}; // SWITCH
A: C++编译器编译下列代码:
复制内容到剪贴板
代码:
typedef typename VIF<(found != 0), aCase::statement, nextSwitch::RET>::RET RET;
的时候,认为 aCase::statement 和 nextSwitch::RET 为一个 static 或者 namespace 或者 class 内的定义。标准写法,在 aCase::statement 和 nextSwitch::RET 之前增加 typename。      
-----------------------------------------
http://www.darkspy.org/blog

自大的人把宗教当迷信,无知的人把迷信当宗教

TOP

发新话题