2013-12-08 57 views
0

目前,我有以下结构(一个或多个)C++结构错误“没有呼叫匹配功能......”

struct LR0Item{ 
    string lhs; 
    vector<string> rhs; 
    int dpos; 
}; 

struct Node{ 
    LR0Item* item; 
    map<string, Node*> tr; 
}; 

struct my_struct{ 
    bool operator()(
        const LR0Item &a, 
        const LR0Item &b) { 
         if(a.lhs != b.lhs) 
          return a.lhs<b.lhs; 
         if(a.dpos != b.dpos) 
          return a.dpos<b.dpos; 
         return a.rhs<b.rhs; 
        } 
}; 

和下面的代码:

vector<string> test_v;    //assume this is filled with various strings 
vector<Node*> N; 
map<LR0Item,Node*,my_struct> nmap; 

LR0Item* Q = new LR0Item("test", test_v, 3);  //1 - error occurs here 
Node* N1 = new Node(Q);       //2 - error occurs here 
N.push_back(N1); 
nmap[*Q] = N1; 

我正在上的错误注释1俗话说:

error: no matching function for call to 'LR0Item::LR0Item(std::string&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, int&)'| 
note: candidates are: LR0Item::LR0Item()| 
note:     LR0Item::LR0Item(const LR0Item&) 

而且我在评论2俗话说错误:

error: no matching function for call to 'Node::Node(LR0Item*&)' 
note: candidates are: Node::Node()| 
note:     Node::Node(const Node&) 

我不完全确定这里发生了什么或如何解决它。

编辑:澄清,不使用C++ 11。

回答

0

你还没有为你的类创建constuctors

你似乎想一个LR0Item(常量字符串&,矢量,int)和一个节点(常量LR0Item &)

一下添加到LR0Item:

LR0Item(const String& lhs_p, vector<string> rhs_p, int dpos_p) 
    : lhs(lhs_p), rhs(rhs_p), dpos(dpos_p) {} 

这添加到节点:

Node(LR0Item * lr) : item(lr) {} 

{}添加其他任何你需要的初始化

做你可能会希望HEVE拷贝构造函数,以及因为一旦你定义构造函数,你不会有默认提供给您

者看多进构造函数和重载operator =,如果你想了解这更深入

+0

尽管Node构造函数仍然给我一个错误,但LR0Item构造函数仍然有效。 “无法在初始化中将const LR0Item转换为LR0Item *。” – Dohrann

+0

对不起 - 现在应该是*了 - –

+0

由于某种原因,它不喜欢Node构造函数中的'const'。考虑到这一点,它的效果很好。你能解释为什么吗? – Dohrann

1

您需要为LR0Item一个构造函数,在错误消息中指定的签名相匹配:

LR0Item::LR0Item(std::string&, std::vector<std::basic_string<char, 
    std::char_traits<char>, std::allocator<char> >, 
    std::allocator<std::basic_string<char, std::char_traits<char>, 
    std::allocator<char> > > >&, int&) 

简化模板和固定了常量性,当然,那就是:

LR0Item::LR0Item(const std::string&, const std::vector<std::string>&, int) 
+0

他没有“需要“这样做,但这是一个可能的解决方法。这比最小修复更多的工作。 –

0

在C++ 11,你可以尝试以下方法:

// Brackets instead of parentheses 
LR0Item* Q = new LR0Item{"test", test_v, 3}; 
Node* N1 = new Node{Q}; 

int main() { 
N.push_back(N1); 
nmap[*Q] = N1; 
} 
0

如果你有一个C + +11编译器,然后只需在这些调用中更改圆括号,即花括号

否则,对于C++ 03编译器,定义构造函数

+0

,如果他仍然在C++ 98? –

+0

@GlennTeitelbaum:C++ 03只是第一个“技术勘误”C++ 98的技术*校正。除了所谓的“值初始化”之外,没有新增加任何新增功能。然而,这可以被视为纠正C++ 98初始化规则中的*设计缺陷。 –

相关问题