std::分配器<_Ty>;::解除分配:无法将参数1从';X';至';Y'; < >我将一些C++代码从VisualStudio 6升级到VisualStudio 2008。

std::分配器<_Ty>;::解除分配:无法将参数1从';X';至';Y'; < >我将一些C++代码从VisualStudio 6升级到VisualStudio 2008。,c++,C++,有一个类“GenExportableTree”,它看起来很像来自Dinkumware的xtree 编译包含此GeneExportableTree的库时,出现以下错误: 错误37错误C2664:'std::allocator::deallocate':无法转换 参数1从“std::CGenExportableTree::\u Node*”到 “CCfwSchemaInfo*” 以下几行是: void _Freenode(_Nodeptr _S) { all

有一个类“GenExportableTree”,它看起来很像来自Dinkumware的xtree

编译包含此GeneExportableTree的库时,出现以下错误:

错误37错误C2664:'std::allocator::deallocate':无法转换
参数1从“std::CGenExportableTree::\u Node*”到
“CCfwSchemaInfo*”
以下几行是:

void _Freenode(_Nodeptr _S)
        {
            allocator.deallocate( _S, 1); 
        }
一些额外信息: 您可以在上面的dinkumware链接下找到GenExportableTree的完整实现

在CCfwSchemaInfo即将出现的地方,我可以找到以下声明:

typedef CGenExportableMap<wstring, CCfwSchemaInfo, GenNoCaseWString> CfwSchemaTable;
typedef CGenExportableMap CfwSchemaTable;
CGenExportableMap的定义如下:

template<class _K, class _Ty, class _Pr = less<_K>,
    class _A = allocator<_Ty> >
    class CGenExportableMap {
public:
    typedef CGenExportableMap<_K, _Ty, _Pr, _A> _Myt;
    typedef pair<const _K, _Ty> value_type;
....
....

    typedef _K key_type;
    typedef _Ty referent_type;
    typedef _Pr key_compare;
    typedef _A allocator_type;
    typedef  typename _A::reference _Tref;
    typedef CGenExportableTree<_K, value_type, _Kfn, _Pr, _A> _Imp;
模板
类CGenExportableMap{
公众:
typedef CGenExportableMap_Myt;
typedef对值_类型;
....
....
typedef_K key_type;
typedef _tyreferent _type;
typedef_Pr key_compare;
typedef_分配程序类型;
typedef typename _A::reference _Tref;
typedef CGenExportableTree _Imp;
在最后一行中,GenExportableTree用于GenExportableMap定义


由于以前都是在vs6下正确编译的,我想实际上一切都是正确的-可能编译器现在更严格了-那么我应该从哪里开始查找编译器抱怨的错误?我应该如何解决这个问题


谢谢!

VC6有严重的模板问题,因此它无法根据标准支持分配器。他们使用了一些早就被删除的特殊攻击


如果某些代码仍然依赖于这些非标准接口,我认为您唯一的选择是修复代码,使其与当前(标准)分配器接口一起工作。对不起。

请提供足够的详细信息,以便能够进行有用的猜测。所有类型是什么?它们的声明或类型定义是什么?“由于之前所有这些都是在vs6下正确编译的,我想实际上一切都是正确的"这是一个不可推论的例子。Visual C++ 6甚至不能称为C++。编译器现在不是更严格的:编译器现在是C++编译器;VS6离遵从性已经远远地偏离了,它同时变成了一个笑话和一个历史注脚。LH!@Tomalak:哈哈,说得好——我本来是要去参加一个“半途而废”的活动的事情……现在我不再因为upvotes而名声大噪了,所以我要关掉电脑去买冰淇淋。@Kerrek:我添加了一些关于类定义和使用位置的额外信息。感谢你的评论,所有这些都是100%正确的;不过,我还是犹豫要不要投票,因为它并没有真正告诉OP如何修复它。他没有提供足够的信息让你去做o、 但是……你还是不知道。@Tomalak-我回答了第一部分“那么我应该从哪里开始查找编译器正在抱怨的错误?”。对于第二个问题,我没有一个简单的解决方案。@Bo-哪些是“非标准接口”,我如何检查?你能给我一个当前(标准)的示例吗分配器接口?@sfonck-我很久没有使用VC6了(自从VS2003问世以来:-)我相信你的问题是,
deallocate
在VC6中使用了一个
void*
指针,而不是
std::allocator
应该做的
T*
。这样你就可以将任何类型的指针传递给任何
std::allocator
,这就是这里发生的情况。现在,我们必须使用每种类型都有一个单独的分配器,这意味着当前的一些容器可能会存储多个分配器,并根据需要使用它们。@Bo:你知道某种类型的开源项目,在那里我可以看到它正在使用(并尝试从中学习)?