2014-12-05 179 views
0

我看到了類似的例子,但沒有完全理解它們,所以請不要馬上將其標記爲重複。 我認爲我的問題有一個簡單的解決方案,我只學習C++模板類的前向聲明C++

我想用:

template<class T, std::size_t N> 
class arnas_array { 
//a copy of std:array functionality, basically, here. 
}; 

在另一個類的頭,另一個文件,例如:

class options_databaze { 

public: 

    struct options_to_save{ 
     arnas_array<char, 123> option_name; 
     //char option_name[103]; 
     int * option_value_pointer; 
    }; 


}; 

我不能得到它的工作。 這樣的正向聲明將無法工作:

template<class T, std::size_t N> 
class arnas_array; 

我不知道很多關於這個問題,我第一次在這裏卡住了,任何例子是金。

error C2079: 'options_databaze::options_to_save::option_name' uses undefined class 'arnas_array<char,123>' 
+2

你前進的聲明實際上是完全正常的,但你不能使用前聲明的類聲明該類型中的一員,直到類完全定義(因爲否則編譯器將沒有確定構件的尺寸的方式,因此'struct options_to_save'的大小)。您可以聲明一個指向該類型的成員,但是(無論數據類型如何,數據指針的大小都是相同的)。 (並且你在類定義的末尾丟失了';',但是我確定這只是一個複製粘貼錯誤。) – Cameron 2014-12-05 22:11:28

+0

我應該如何避免前向聲明,然後在每個文件中使用相同的類? – Tomas 2014-12-05 22:14:30

+2

作爲提示,始終包含在發佈 – harmic 2014-12-05 22:15:43

回答

2

該問題與模板無關。在C++中,類型T必須是完整的,特別是如果聲明瞭T類型的非靜態類數據成員(請參閱標準的3.2/5 (One definition rule)部分或讀取more human-readable version here)。

「必須是完整的」指的是類T的定義應先於相應的數據成員的定義。正如Cameron在評論中指出的那樣,一種常見的方法是在頭文件中定義一個定義,並在需要的地方包含該頭 - 這與您在包含標準頭文件(如<vector><map>等。

+0

謝謝,因爲這個類已經在頭(它有所有的定義,和其他2個小類,它就像一個主要的東西頭),我認爲這並非如此,因爲我已經包含了頭。但似乎像定義了arnas_array類的單獨頭文件解決了這些問題。 – Tomas 2014-12-05 23:23:25