此贴内容不是编程精华版内的内容,是我回答一个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;
}; // SWITCHA: C++编译器编译下列代码:
复制内容到剪贴板
代码:
typedef typename VIF<(found != 0), aCase::statement, nextSwitch::RET>::RET RET;的时候,认为 aCase::statement 和 nextSwitch::RET 为一个 static 或者 namespace 或者 class 内的定义。标准写法,在 aCase::statement 和 nextSwitch::RET 之前增加 typename。