2017-12-12 1 views
-1

나는 허프만 트리를 구현하는 템플릿으로 설계된 프로그램을 가지고 있습니다. My HuffmanNode 클래스에는 두 가지 데이터 유형이 있습니다. 다음은 클래스 구현입니다.C++에서 다른 데이터 형식을 사용하여 클래스 템플릿 포인터에 대한 포인터를 선언하는 방법

#pragma once 

template <typename T, typename U> class HuffmanNode 
{ 
private: 
    int frequency; 
    T value; 
    U code; 
    HuffmanNode<T, U>* left, *right; 
public: 
    HuffmanNode<T, U>() : 
     value(' '), frequency(0), left(nullptr), right(nullptr) {} 
    HuffmanNode<T, U>(T v, U i) : 
     value(v), frequency(i), left(nullptr), right(nullptr) {} 
    HuffmanNode<T, U>(HuffmanNode<T, U>* left, HuffmanNode<T, U>* right) 
    { 
     this->left = left; 
     this->right = right; 
     frequency = left->getFrequency() + right->getFrequency(); 
     value = NULL; 
    } 
}; 

내 HuffTree 클래스에는 HuffmanNode 포인터를 가리키는 포인터가 있습니다. 내가 여러 가지 방법으로 HuffmanNode 포인터에 포인터를 선언했지만 어느 쪽이든, 나는 오류가 발생했습니다.

template <class T, class U> 
HuffmanNode<T, U>** storage; // Error: 'HuffTree<T>::storage': only static data member templates are allowed 

어떻게 이러한 포인터를 선언 할 것이다 :

HuffmanNode<T>** storage; // Error: 'HuffmanNode': too few template arguments 

그런 다음 나는이 같은 두 데이터 유형의 시도 :

나는 이런 식으로 선언?

편집 : 나는 HuffmanNode 포인터에서 두 데이터 유형을 포함하는 HuffTree 클래스를 업데이트하지만 지금은 HuffTree 클래스를 포함 내 HuffmanCode 클래스에서 오류를 얻을.

#pragma once 
#include <string> 
#include <map> 
#include"HuffmanTree.h" 
using std::string; 
using std::map; 
template <typename T, typename U> class HuffmanCode 
{ 
private: 
    string data; 
    string encodedData; 
    HuffTree<T, U>* tree; 
    map<T, U> frequencyTable; 
    map<T, U> huffmanTable; 
    void buildTree() 
    { 
     for (map<T, U>::iterator it = frequencyTable.begin(); 
      it != frequencyTable.end(); ++it) 
     { 
      /* 
      this line gives me an error: 'HuffmanNode<char,std::string>:: 
      HuffmanNode(const HuffmanNode<char,std::string> &)': 
      cannot convert argument 1 from 'const std::string' to 'char' 
      */ 
      tree->insert(new HuffmanNode<char, string>(it->first, it->second)); 
     } 
    } 
public: 
    HuffmanCode<T, U>(T input) 
    { 
     data = input; 
     encodedData = ""; 
     // create tree to be large enough for worst case 
     tree = new HuffTree<T, U>(data.length()); 
     buildTable(); 
     buildTree(); 
    } 
    }; 

는 여기를 테스트하는 내 소스 파일입니다 : 여기

#pragma once 
#include "HuffmanNode.h" 
using namespace std; 

template <typename T, typename U> class HuffTree 
{ 
private: 
    HuffmanNode<T, U>** storage; 
    int treeSize; 
    int capacity; 

public: 
HuffTree<T, U>(int size) 
{ 
    capacity = size; 
    treeSize = 0; 
    storage = new HuffmanNode<T, U>*[capacity]; 
    for (int i = 0; i < capacity; i++) 
    { 
     storage[i] = NULL; 
    } 
} 
// I get an error in the HuffmanCode class when calling this function 
void insert(HuffmanNode<T, U>* rhs) 
{ 
    treeSize++; 
    storage[treeSize - 1] = rhs; 
    percUp(treeSize - 1); 
} 
}; 

내가 포인터 문제를 해결하는 것이 지금 나에게 오류를 제공하는 HuffmanCode 클래스의 코드입니다 : 여기에 HuffTree 클래스에 대한 업데이트 된 코드는 기능 :

#include <iostream> 
#include <string> 
#include "HuffmanCode.h" 
using namespace std; 

int main() 
{ 
    string text; 
    cout << "Enter some text:\n"; 
    getline(cin, text); 
    HuffmanCode<string, string>* huffText = new HuffmanCode<string, string>(text); 

    huffText->displayTable(); 
    huffText->displayHuffmanTable(); 

    string code = huffText->getEncodedString(); 
    cout << "Encoded string: " << code << endl << endl; 
    cout << "Decoded string: " << huffText->decodeString(code) << endl << endl; 

    delete huffText; 

    return 0; 
} 

편집 관련 코드를 포함하는

+1

은 "더블 포인터"같은 것은 없다 (또는 다른 데이터는 알아서 입력) . 템플릿을 사용하지 않고도 트리를 작성할 수 있습니까? 그렇지 않으면 템플릿을 사용하여 쓰기를 시도하지 마십시오. –

+1

템플릿을 만드는 것은 어렵습니다 (처음에는 Scott Meyers, Herb Sutter, Sean Parent가 나와 동의하지 않습니다). Neil Butterworth의 조언은 정말 좋습니다. 시작하지 않고 클래스를 템플릿으로 만듭니다. 일단 작업을하게되면 세부 사항에서 템플릿을 "추상화"합니다. – Eljay

+0

"더블 포인터"를 "포인터 투 포인터"로 변경하기 위해 내 게시물을 편집했습니다. 할당을 위해 템플릿을 사용하여 트리를 작성해야합니다. – softengstu

답변

0

다른 템플릿 인수 유형을 정의 할 수없는 경우 HuffTree 클래스에서 직접 지정하십시오. 이 중 하나는 맞게해야합니다

HuffmanNode<T, T> ** storage;

또는

HuffmanNode<T, string> ** storage;

+0

이 프로그램의 모든 코드에 대한 링크를 포함하도록 내 게시물을 편집했습니다. – softengstu

+0

저장 선언은 동일합니다. 완전을 위해 "완전한"클래스 선언을 추가했습니다. 해당 행을 복사 할 수 있습니다. –

+0

나는 그것을 시도했지만 더 많은 오류가 발생했습니다. HuffTree는 클래스 T와 클래스 U를 모두 매개 변수로 사용해야하는 다른 클래스에서도 사용되지만 작동하지 않습니다. github에 대한 전체 프로그램 링크를 게시 했으므로 모든 코드를 볼 수 있습니다. – softengstu

관련 문제