2014-12-05 883 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