2017-08-31 89 views
0

的模板,所以我有代表說,自定義集合如下模板:C++構造模板

template <typename T> class MyCollection { 
    private: 
     std::vector<T> v; 

    public: 
     MyCollection(int n) { 
      v.resize(n); 
     } 
    etc 
} 

但是現在,我要實例MyCollection的對象MyCollection的,所以我做這在我的主程序:

MyCollection<MyCollection<int>> mycoll= MyCollection<MyCollection<int>>(100); 

這確實會編譯(我的MAC,使用以下):

clang++ -std=c++11 -stdlib=libc++ test.cpp 

問題是我得到這樣一個鏈接器錯誤:

Undefined symbols for architecture x86_64: 
"std::__1::__vector_base_common<(unsigned char)1>::__throw_length_error() const", referenced from: 
    std::__1::vector<MyCollection<int>, std::__1::allocator<MyCollection<int> > >::allocate(unsigned long) in test-891fb4.o 

這究竟是什麼,我該如何解決它?它看起來像一個關於vector>的分配器丟失了嗎?爲什麼會發生這種情況,我該如何解決?

+0

默認的C++運行時是GNU實現,並在使用libC++編譯時混淆鏈接器。 –

+0

那麼我該如何解決這個問題? – Marc

+0

你試過了嗎?clang ++ -std = C++ 11 -stdlib = libC++ test.cpp -lsupC++'? libsupC++定義了異常 – Praetorian

回答

1

你的構造函數有一個參數。您正嘗試構建嵌套的MyCollection而沒有任何參數。這是不可能的。你需要給第二個構造函數,它爲內部集合提供一個初始化器。

#include <vector> 

template <typename T> 
class MyCollection 
{ 
private: 
    std::vector<T> v; 

public: 
    explicit MyCollection(int n) : v(n) {} 
    explicit MyCollection(int n,T const& init) : v(n,init) {} 
}; 

int main() 
{ 
    MyCollection<MyCollection<int>> mycoll(100,MyCollection<int>(1)); 
} 

除了初始值設定項,您還可以提供一個默認構造函數。

#include <vector> 

template <typename T> 
class MyCollection 
{ 
private: 
    std::vector<T> v; 

public: 
    MyCollection() : v(0) {} 
    explicit MyCollection(int n) : v(n) {} 
}; 

int main() 
{ 
    MyCollection<MyCollection<int>> mycoll(100); 
} 
+0

對不起,我仍然得到相同的鏈接錯誤 – Marc

+0

@Marc也許你需要明確地鏈接LibC++'clang ++ -stdlib = libC++ test.cpp -lC++' –

+0

我也試過,沒有運氣 – Marc

0

好吧,你不會相信這一點。事實證明,答案與包含的命令行或庫無關。我有基本的數據類型的* .h文件,其中我有這個代碼:

#ifndef bool 
#define bool unsigned char 
#endif 

不知何故,這個混亂與布爾深的一個預先定義的庫之一,導致看起來風馬牛不相及的鏈接錯誤。無論如何,它現在起作用。

+1

你爲什麼要在你的代碼中加入類似的東西?不要混淆基本類型!如果你需要一些破損的API,最好使用'使用bool_t =無符號字符',並在每個地方使用'bool_t'而不是'bool'。 –