2012-07-25 67 views
1
兩個容器

讓我們假設我有一個類容器:如何分配具有不同的模板參數

template<class T, int size> 
class container 
{ 
private: 
    T* data; 
    int length; 
public: 
    container() 
    { 
     data=new T[size]; 
     length=size; 
    } 
    ~container() 
    { 
     if(length>0) 
      delete[] data; 
    } 
    container& operator= (container<T,size> c) 
    { 
     if(length>0) 
      delete[] data; 
     data=new T[c.length]; 
     length=c.length; 
     for(int i=0; i<length; i++) 
      data[i]=c.data[i]; 
     return *this; 
    } 
}; 

的問題是,如果我有兩個不同大小的容器,我不能使用=運算符例如:

container<int,4> c1; 
container<int,5> c2; 
c1=c2; // syntax error: 4!=5 

類似C++ 11數組允許這樣做。
如何做到這一點?

+4

爲什麼'size'是一個模板參數?你的'container'的_size_似乎是動態的。 – 2012-07-25 17:14:46

+1

您不只有兩個不同大小的容器,您有兩個具有不同模板參數的對象 - 它們不兼容。對於編譯器來說,就好像您試圖將一個int的容器分配給一個浮動容器。通常,容器的長度不是模板參數。 – 2012-07-25 17:15:35

+1

記住複製構造函數。通過將大小設置爲模板參數,您也有點使用動態內存。例如,您無法讓用戶輸入大小。 – chris 2012-07-25 17:15:44

回答

2

模板是 - - 編譯器用來創建類的模板,而不是它們自己的類。

因此,container<int,4>container<int,5>是完全獨立的類,具有所有的訪問限制。

特別是,這意味着container<int, 4>的賦值操作符不能訪問container<int,5>private成員。

有幾種方法來解決這個問題:

  • 消除尺寸模板參數,因爲正如其他人所指出的,你似乎是動態分​​配的內存,在編譯時ISN所以釘下來的大小」不會增加任何值,並且實際上可能會產生誤導,因爲您的賦值運算符可能會導致與所聲明的大小不同的大小。
  • 根據container的公共接口實現您的賦值運算符。
  • 通過添加以下行到您的類聲明的所有container類相同類型friends的:

代碼:

template<class U, int otherSize> friend class Foo; 

,並宣佈你的賦值運算符如下:

template <int otherSize> 
container<T,size>& operator=(container<T,otherSize> c); 
1

你需要用容器的尺寸參數化的分配新建分配FY運營商要從分配(忽略任何其他問題發佈代碼):

template <int otherSize> 
    container& operator= (container<T,otherSize> c) 
    { 
     if(length>0) 
      delete[] data; 
     data=new T[otherSize]; 
     length=otherSize; 
     for(int i=0; i<otherSize; i++) 
      data[i]=c.data[i]; 
     return *this; 
    } 
+0

不會編譯,'data'是私有的。除此之外,這是唯一可能的解決方案,儘管問題評論中提到的問題仍然存在。 – Zeta 2012-07-25 17:28:26

+0

顯然,由於原始代碼不會編譯(也出於這個原因);) – tumdum 2012-07-25 17:29:56

0

正如評論者所指出的那樣,具有初始大小是模板參數看起來不正確,並且是問題的根源。

但是考慮到從兩個不兼容的容器中分配的一般問題,你可以根據tumdum的答案顯示的模板operator=,但是當你想從另一個稍微不同的類型填充容器時,這並沒有幫助。

標準集裝箱通過允許一定範圍的建設和分配,由一對迭代器定義解決的問題:

template<typename FwdIter> 
    container(FwdIter begin, FwdIter end) 
    { 
    data=new T[length = std::distance(begin, end)]; 
    std::copy(begin, end, data); 
    } 

template<typename FwdIter> 
    void 
    assign(FwdIter begin, FwdIter end) 
    { 
    container(begin, end).swap(*this); 
    } 

void swap(container& c) 
{ 
    std::swap(data, c.data); 
    std::swap(length, c.length); 
} 

iterator begin() { return data; } 
const_iterator begin() const { return data; } 
const_iterator cbegin() const { return data; } 
iterator end() { return data+size; } 
const_iterator end() const { return data+size; } 
const_iterator cend() const { return data+size; } 

現在你可以這樣做:

container<int,4> c1; 
container<int,5> c2; 
c1.assign(c2.begin(), c2.end()); 
相關問題