C++编译错误
问题描述:
我有这个类双链表:C++编译错误
template <typename T>
class Akeraios
{
struct node
{
T data;
node* prev;
node* next;
node(T t, node* p, node* n) : data(t), prev(p), next(n) {}
};
node* head;
node* tail;
public:
Akeraios() : head(NULL), tail (NULL) {}
template<int N>
Akeraios(T (&arr) [N]) : head(NULL), tail (NULL) //meta apo : simainei einai initializer list--arxikopoiisi listas
{
for(int i(0); i != N; ++i)
push_back(arr[i]);
}
bool empty() const { return (!head || !tail); }
operator bool() const { return !empty(); }
void push_back(T);
void push_front(T);
T pop_back();
T pop_front();
~Akeraios()
{
while(head)
{
node* temp(head);
head=head->next;
delete temp;
}
}
};
在
和地方主要
int arr[num1len];
int i=1;
Akeraios <int> dlist (arr);//error line!!
for(i=1;i<=num1len;i++){
double digit;
int div=10;
int j;
for(j=1;j<=i;j++)div=div*div;
digit=number1/div;
int dig=(int) digit;
在错误行的错误是:
没有匹配功能调用`Akeraios :: Akeraios(int [((unsigned int)((int)num1len))])'
名候选人是:Akeraios :: Akeraios(常量Akeraios &)
注Akeraios :: Akeraios()与T = INT]
答
此代码是完全合法合规原样。我可以看到它搞砸的唯一方法是如果你有一个针对VLA的编译器扩展,并试图用可变长度的数组调用构造函数,这几乎肯定会失败。否则,这是完全合法的。 Visual Studio接受而不争吵。
答
试试这个:
Akeraios <int>* dlist = new Akeraios(arr);
你的编译器会认为你按照你所做的方式调用一个函数。
,你也可以使用隐式构造
Akeraios<int> dlist = arr;
(不是很漂亮,这是)
答
既然你说num1len
是一个变量:
模板在编译时进行评估。当你说arr[num1len]
时,你指定了一个长度可变的数组(这是C99还是什么?)。模板需要一个大小可以在编译时进行评估的数组(你说的是template<int N>Akeraios(T (&arr) [N])
,所以编译器无法匹配这个数组。
想象一下,你有一个专业化的N = 5或N = 10.编译代码时,编译代码时如何才能找到合适的分类?
什么是'num1len`? – 2010-12-02 21:46:17
num1len是整数 - 一个数字的长度长数字,我想我的数组存储每个数字分开 – Dchris 2010-12-02 21:48:44