2013-02-12 204 views
0
class RLE_v1 
{ 
    struct header 
    { 
     char sig[4]; 
     int fileSize; 
     unsigned char fileNameLength; 
     std::string fileName; 
    } m_Header; 

    RLE<char> m_Data; 

public: 
    void CreateArchive(const std::string& source) 
    { 
     std::ifstream::pos_type size; 
     char* memblock; 
     std::ifstream file (source, std::ios::in|std::ios::binary|std::ios::ate); 
     if (file.is_open()) 
     { 
      size = file.tellg(); 
      memblock = new char [static_cast<unsigned int>(size)]; 
      file.seekg (0, std::ios::beg); 
      file.read (memblock, size); 
      file.close(); 
      // 
      // trying to make assignment to m_Data here. 
      // 
      delete[] memblock; 
     } 
    } 

    void ExtractArchive(const std::string& source); 
}; 

我試圖以「memblock」字符數組變量M_DATA數據複製,但是當我嘗試這樣做,我得到的錯誤no match for operator "=" matches these operands。我不知道如何讓他們平等,因爲m_Data已經是char類型。C++的錯誤 - 不匹配運算符=

這是具有可變M_DATA你已經證明,除了產生錯誤的實際行一切MEM

template <typename T> 
struct RLE 
{ 

    T* m_Data; // Memory which stores either compressed or decompressed data 
    int m_Size; // Number of elements of type T that data is pointing to 

    RLE() 
     : m_Data(nullptr) 
     , m_Size(0) 
    { } 

    ~RLE() 
    { 
     delete m_Data; 
    } 
}; 

回答

1

的RLE類。

但我看到的是這個。你必須具有成員的類:

RLE<char> m_Data; 

模板擴建後,該結構將有成員:

char *m_Data; 

你說有沒有operator=當你將memblockm_Data。所以,我只能說你這樣做:

m_Data = memblock; 

您應該在哪裏實際上做這樣的:

m_Data.m_Data = memblock; 
m_Data.m_Size = size; 

,而不是直接對結構的內部操作,你可能會更好做一個函數:

template <typename T> 
void RLE<T>::Alloc(size_t size) 
{ 
    if(m_Data != nullptr) delete [] m_Data; 
    m_Data = new T [size]; 
    m_Size = size; 
} 
+0

爲什麼它應該是m.Data.m_Data?對不起,我有點困惑 – user1665569 2013-02-12 03:20:00

+0

和是的,我正在嘗試做m_data = memblock;而產生錯誤的那一行是我說的「我試圖複製數據......」對不起。 – user1665569 2013-02-12 03:21:27

+1

+1我猜如果通過'delete [] memblock'立即跟蹤那個指向'RLE '的指針可能會變得毫無價值。並且遵循您的Alloc建議,甚至可以使用更多主頁:'RLE :: ReadStream(ifstream&inf,size_t size)'也可以派上用場。 – WhozCraig 2013-02-12 03:21:44