用戶k在運行時設定。這個數字將constant用于代碼的其余部分。我想創建一個函式來傳遞和創建一個結構,該結構包含一個大小為 k 的陣列和該數字。但是,編譯器回傳此錯誤:
Non-type template argument is not a constant expression
任何建議將不勝感激。
代碼如下:
template <int N>
struct UL {
unsigned long ul [N];
};
void func(const int k){
UL<k> x; //problem is here
}
int main () {
int k;
cin >> k;
func(k);
return 0;
}
uj5u.com熱心網友回復:
變數k是在運行時設定的,所以在編譯代碼時,編譯器不知道它的值k是什么。你不能這樣做。但是,如果您知道您的k值將是什么并且可以限制的值范圍,您可以為每個可能的值創建結構k并在運行時選擇匹配的類。當然,這可能不是您想要的。您只需要能夠區分編譯時和運行時已知的內容。模板文字(我希望我使用了正確的名稱)是 C 的編譯時特性。
uj5u.com熱心網友回復:
模板僅在編譯時處理。您不能將運行時變數(如函式引數)傳遞給模板。對于您正在嘗試做的事情,您將不得不使用std::vector,例如:
#include <vector>
struct UL {
std::vector<unsigned long> ul;
};
void func(const int k){
UL x;
x.ul.resize(k);
}
int main () {
int k;
cin >> k;
func(k);
return 0;
}
uj5u.com熱心網友回復:
關于模板的一個基本原則是:
任何模板引數都必須是可以在編譯時確定的數量或值。
這對模板物體的運行時成本具有顯著優勢。
但是在您的示例中,kis 不是編譯時間常數,并且您將其用作模板引數,因此由于上述參考的陳述句,您會收到錯誤。
要解決您的問題,您可以使用std::vector如下所示的:
#include <iostream>
#include <vector>
struct UL {
std::vector<unsigned long> ul;
//constructor
UL(int k): ul(k) //this creates vector ul of size k
{
std::cout<<"size of vector set to: "<<ul.size()<<std::endl;
}
};
void func(const int k){
UL x(k); //pass k as argument to constructor
}
int main () {
int k;
std::cin >> k;
func(k);
return 0;
}
程式的輸出可以在這里看到。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/413514.html
標籤:
