[英]c++ compile error
我有此類的雙鏈表:
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(const Akeraios&)
注意Akeraios :: Akeraios()[with T = int]
嘗試這個:
Akeraios <int>* dlist = new Akeraios( arr );
您的編譯器認為您正在按照自己的方式調用函數。
您還可以使用隱式構造函數
Akeraios<int> dlist = arr;
(這不是很好)
此代碼是完全有效的,並且符合原樣。 我看到的唯一混亂的方法是,如果您具有VLA的編譯器擴展,並嘗試使用可變長度數組來調用構造函數,這幾乎肯定會失敗。 否則,這是完全合法的。 Visual Studio不加爭吵地接受。
因為您說的是num1len
是一個變量,所以:
模板在編譯時進行評估。 當您說arr[num1len]
,您要指定一個長度可變的數組(這是C99還是其他?)。 模板期望一個數組,該數組的大小可以在編譯時求值(您說的是template<int N>Akeraios( T (&arr) [N])
,因此編譯器無法將其匹配。
試想一下,您有一個專門化的N = 5或N = 10。 如果當時還不知道數組的大小,編譯器將如何在編譯代碼時找到合適的專業化?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.