2016-10-03 140 views
0

所以我用從一個自定義的矢量容器:https://github.com/patr0nus/Vector/blob/master/Vector.h自定義矢量不支持的unique_ptr

,我試圖創造的unique_ptr指針的向量自定義類對象。

它曾經失敗:

error: object of type 'std::__1::unique_ptr std::__1::default_delete>' cannot be assigned because its copy assignment operator is implicitly deleted

我固定它通過添加以下代碼vector.h:

void push_back(T&& val) 
    { 
     resize(m_size + 1); 
     m_container[m_size - 1] = std::move(val); 
    } 

現在的問題是,我無法遍歷這個矢量和其他功能,如swap是失敗:

no matching function for call to 'swap' 
     swap(*__x4, *__x5); 
candidate template ignored: could not match 'tuple' against 'unique_ptr' 
swap(tuple<_Tp...>& __t, tuple<_Tp...>& __u) 

我需要如何解決日一些指導這些問題。

+0

這個載體似乎是專爲使用只有POD類型。 –

+9

使用'std :: vector'是解決方案。爲什麼你首先需要這個定製的?這個實現的問題是絕對需要'T'是CopyConstructible,當'std :: unique_ptr'不是。 – AndyG

+3

嗯......爲什麼不使用std :: vector? – mascoj

回答

5

您不能使用patr0nus/Vector與非POD類型。原因很簡單:它在很多地方使用memcpy,並且要求類型被複製爲構造函數。

與其他不是POD的東西一起使用實際上是未定義的行爲。不要將該向量用於非POD類型。沒有辦法繞過它。您可能已經知道,您可以使用定義明確的實現,該實現尊重一組精確的需求,並且可能比該矢量實現更優化:std::vector

如果您有一些內存或分配約束,您可以實現自定義分配器。

1

要添加到給定的答案中,因爲您的矢量類僅適用於POD類型,所以確保您只使用POD類型的方式是使用std::is_pod函數以及static_assert。使用這些C++工具將禁止創建違反​​POD要求的程序。

當你構建的載體,可以使測試這些功能:

#include <algorithm> 
//... 
template<typename T> 
class Vector 
{ 
    Vector(int initialSize = 1) 
    { 
     static_assert(std::is_pod<T>(), "Sorry, only POD types are allowed"); 
    //... 
    } 

    Vector(const Vector &source) 
    { 
     static_assert(std::is_pod<T>(), "Sorry, only POD types are allowed"); 
     //... 
    } 
    //... 
}; 

這確保瞭如果有人是做這樣的事情:

Vector<std::string> sV; 

編譯器錯誤將顯示而不是代碼編譯,並導致你現在看到的問題。

+0

'is_pod'可以轉換爲bool,所以'static_assert(std :: is_pod {},「blah」)'是合適的。另外,你可以在課堂頂端聲明一次。 :) – GManNickG

0

在調整大小()函數,你必須:

{ 
... 
      m_capacity = size * 2;//The new capacity is double of the size. 
      T* oldPtr = m_container; 
      m_container = (T*)malloc(m_capacity * sizeof(T));//Allocate the new container. 
      memcpy(m_container, oldPtr, m_size * sizeof(T));//Copy the elements. 
      destory(oldPtr, m_size);//Destory the old container. 
      free(oldPtr); 
... 
} 

所以你需要把POD(普通舊數據)元素你向量:
What are POD types in C++?