【问题标题】:Static map initializer function error静态地图初始化函数错误
【发布时间】:2011-11-24 11:30:40
【问题描述】:

我收到以下基本错误:

1>c:\program files\microsoft visual studio 10.0\vc\include\utility(163): error C2436: 'second' : member function or nested class in constructor initializer list

还有很多子错误——我完全不知道去哪里看或哪里出了问题。 (我知道它是关于什么功能的,但我一直在盯着自己看,为什么它不起作用)

标题部分:

typedef void *DuplicateFn(pTree&, const pTree&); 
enum DuplicateTy {
    SKIP,
    OVERWRITE,
    ASK
};
typedef std::map<DuplicateTy, DuplicateFn> DuplicateMapTy;

static const DuplicateMapTy DuplicateFns;
static DuplicateMapTy DuplicateFns_INIT();

详细命名空间:

namespace detail {
    void OverWriteFn(GMProject::pTree& tOut, const GMProject::pTree& tIn);
    void AskFn(GMProject::pTree&  tOut, const GMProject::pTree& tIn);
}

源码部分:

GMProject::DuplicateMapTy GMProject::DuplicateFns_INIT() {
    DuplicateMapTy tmp;
    auto p(std::make_pair(GMProject::OVERWRITE, &detail::OverWriteFn));
    tmp.insert(p); //offending line
    return tmp;
}
const GMProject::DuplicateMapTy GMProject::DuplicateFns(GMProject::DuplicateFns_INIT());

正如我所说的那样,我对此视而不见,为什么我不能将那对插入到地图中?我只是插入一个函数指针和一个枚举?

【问题讨论】:

  • 您的函数 typedef 可能有误。试试:typedef void (*DuplicateFn)(pTree&amp;, const pTree&amp;);
  • std::map<...> 模板的实例化似乎出了点问题。编译器是否指向 std::map? 的模板构造函数
  • @visitor doh,这肯定是个小问题。虽然微不足道 - 我了解到您必须在 typedef 函数指针周围加上大括号。然而为什么? - 没有牙套我该怎么说? (PS:把它放在答案中>
  • @paul23:在您的代码中,编译器认为您正在为void* 定义一个typedef。奇怪的事情发生了。

标签: c++ initialization static-members


【解决方案1】:

我可能错了,但我不喜欢这条线:

auto p(std::make_pair(GMProject::OVERWRITE, &detail::OverWriteFn));

您使用的是 VS 2010 吗?可以将变量名(p)悬停,查看auto推导出的类型。

另外,你试过了吗:

 tmp.insert(std::make_pair(GMProject::OVERWRITE, &detail::OverWriteFn));

或者

tmp.insert(std::pair(GMProject::OVERWRITE, &detail::OverWriteFn));

?

【讨论】:

    猜你喜欢
    • 2012-11-07
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    相关资源
    最近更新 更多