2017-01-13 12 views
3

C++에서 접미어 trie를 구현하는 프로그램을 작성하고 있습니다. 매개 변수없이 재귀 함수를 선언하려고하지만 자체에 대한 포인터를 전달해야합니다.포인터가있는 C++ 기본 인수

I는 노드가 이미 선언 된 데이터 구조 .cpp 파일에 따라서

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; 
} 

public: 
    string longestRepeat(Node*); 
헤더 파일

그것을 형성하고있다.

주 함수에서 단순히 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 
} 

그러나 무엇을해야 아마 할 &nodes[0] 수있는 전용/보호 버전 호출 longestRepeat의 공개 버전을 만들 수 있습니다 :

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

감사합니다. 하지만 이제는'longestRepeat()'가 야심적이라고 주장하는 오류 메시지가 나타납니다. 웬일인지 그것은 주된 기능에서 2를 선택할 수 없다. –

+0

@ 루케 콜린 첫 번째 또는 두 번째 발췌 문장을 시도 하시겠습니까? – Holt

+0

밑줄을 깜박했습니다! –

2

멤버 함수의 경우 클래스 외 정의에서는 default argument을 선언 할 수 있지만 기본 인수를 사용하여 멤버 함수를 호출하는 것은 정의를 볼 수있는 변환 단위에서만 가능합니다.

즉, 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