2017-02-09 94 views
0

我有以下代码:构造错误:错误:预期“”或“...”前的数字常量

#include <memory> 
#include <functional> 
#include <string> 
#include <unordered_map> 

typedef std::shared_ptr<std::string> StrPtr; 
auto hash1 = [](const StrPtr ptr) { return std::hash<std::string>()(*ptr); }; 

... 

class Actor { 

    ... 

    private: 
     std::unordered_multimap<StrPtr,StrPtr,decltype(hash1)> set(250000,hash1); 
    ... 
}; 

如果我想编译它,我得到以下错误:

Actor.hpp:15:68: error: expected identifier before numeric constant 
    std::unordered_multimap<StrPtr,StrPtr,decltype(hash1)> set(250000,hash1); 
                   ^
Actor.hpp:15:68: error: expected ‘,’ or ‘...’ before numeric constant 

看看unordered_multimap的构造函数定义,似乎与我的初始化没有矛盾。这里有什么问题?

我用gcc编译4.8

+3

IIRC,如果你想进行内联初始化,你需要使用花括号'{}'。另外,请记住GCC 4.8是旧的,并且不支持所有的C++ 11,所以它可能根本不支持内联初始化。 –

+1

我相信编译器会非常困惑,因为它认为你声明了一个成员函数。 – molbdnilo

+0

使用'gcc version 5.3.1'给出了相同的结果。仍然我不明白为什么这不是有效的语法 – FloriHe

回答

1

定期括号不是在允许大括号或-等于初始化。使用大括号:

std::unordered_multimap<StrPtr,StrPtr,decltype(hash1)> set{250000,hash1}; 

此限制可防止在使用括号的函数声明的某些情况下出现的歧义。

+0

好吧,那“工作”。但现在我得到了警告:'警告:'Actor'有一个字段'Actor :: set',其类型使用匿名命名空间 class Actor',我不明白。顺便说一下,是否可以在函数中使用正则括号的初始化。因为我最初在一本书中看到了这个例子,在这个函数里面使用了带有常规派生符的这个结构。 – FloriHe

+0

正确。初始化局部变量时可以使用正则括号,但不能在括号或等于初始值设定项中使用。如果您遇到新问题,但无法解决问题,请使用[mcve] – user2079303

+0

发布一个新问题。如果我发布另一个问题,但问题没有得到解决,那么最好不要使用我的问题太快了。 – FloriHe

相关问题