2017-01-13 59 views
3

我正在编写一个在C++中实现后缀trie的程序。我试图声明一个没有参数的递归函数,但是需要将一个指针传递给它自己。带指针的C++默认参数

我在cpp文件,其中节点是先前声明的数据结构从而限定它

public: 
    string longestRepeat(Node*); 
在头文件

,和

string Trie::longestRepeat(Node* start = &nodes[0]){ 
    string deepest = ""; 
    for(unsigned int i = 0; i < start->getEdges(); i++){ 
     string child_deepest = longestRepeat(start->getChild(i)); 
     if(child_deepest.length() > deepest.length()) 
      deepest = child_deepest; 
    } 
    return deepest; 
} 

但是在主函数中简单地调用trie.longestRepeat()会导致错误“Trie::longestRepeat()没有匹配的函数调用。候选者期望1个参数,0提供”。

回答

4

你需要把默认的参数在声明(在头文件),如果你把它放在第二个声明(定义),它只会被调用看到第二个使用声明:

struct Trie { 
    std::string longestRepeat(Node*); 
}; 

int main() { 
    Trie{}.longestRepeat(); // Error 
} 

std::string Trie::longestRepeat(Node *p = &nodes[0]) { } 

void g() { 
    Trie{}.longestRepeat(); // Ok 
} 

但你或许应该做的是创造的longestRepeat公版调用私人/保护版本&nodes[0]

struct Trie { 
    std::string longestRepeat() { // No arguments 
     longestRepeat_(&nodes[0]); 
    } 
private: 
    std::string longestRepeat_(Node *); // Real implementation 
}; 
+0

感谢您的支持。但是现在我收到一条错误消息,声称'longestRepeat()'是雄心勃勃的;由于某些原因,它不能在主函数中选择两者之一。 –

+0

@LukeCollins你在尝试第一个还是第二个片段? – Holt

+0

我忘了下划线! –

2

对于成员函数,可以在类外定义中声明default argument,但只有在可以看到定义的tranlation单元中使用默认参数调用成员函数。

这意味着您可以将Trie::longestRepeat的定义移动到头文件以修复错误。

或者让事情变得更简单,在声明中声明默认参数而不是定义。例如

// header 
public: 
    string longestRepeat(Node* start = &nodes[0]); 

// implementation 
string Trie::longestRepeat(Node* start) { 
    ... 
} 

对于非模板类的成员函数,默认参数 允许上外的类的定义,并且与由所述声明的类的内部的 缺省参数被组合身体。

class C { 
    void f(int i = 3); 
    void g(int i, int j = 99); 
}; 
void C::f(int i = 3) {   // error: default argument already 
}        // specified in class scope 
void C::g(int i = 88, int j) { // OK: in this translation unit, 
}        // C::g can be called with no argument