2012-12-28 59 views
0

我有一個模板:模板 - 傳遞變量,而不是價值

template<unsigned int N> struct IntN; 

template <> struct IntN< 8> { 
    typedef uint8_t type; 
}; 

template <> struct IntN<16> { 
    typedef uint16_t type; 
}; 

而在主我做這個初始化和替代:

IntN< 8>::type c; 

這似乎是工作,但是,當我存儲一個變量的值,它不,我得到以下錯誤:

error: non-type template argument of type 'int' is not an integral constant expression

這是一個代碼示例:

template<unsigned int N> struct IntN; 

template <> struct IntN< 8> { 
    typedef uint8_t type; 
}; 

template <> struct IntN<16> { 
    typedef uint16_t type; 
}; 

int main(int argc, char *argv[]) { 
int foo = 8; 

IntN<foo>::type c; 
} 

有沒有人有任何想法?謝謝

回答

7

積分模板參數的模板參數必須是常量表達式。一個組成字面爲常量表達式

IntN<8>::type c; 

具有恆定表達初始化常量變量是一個常量表達式

const int n = 8; 
IntN<n>::type c; 

在這裏,n是行,因爲它是const和由常量表達式進行初始化(8) 。下面雖然不會編譯:

int n = 8; 
const int m = n; 
IntN<n>::type c; //error n is not const therefore not a constant expression 
IntN<m>::type c; //error m is const but initialized with a non-constant expression therefore not a constant expression 
+0

嘿,就是這樣!但我在程序中的其他位置設置了值,因此它不能保持不變。任何想法? – Phorce

+0

@ user1326876如果它的值是運行時確定的,那麼您無法將其作爲模板參數傳遞。模板在編譯時被實例化 –

0

函數模板是一個藍圖告訴編譯器如何爲功能它被實例化生成的代碼(即當你使用一個模板函數你的代碼)。

正好編譯器會產生什麼取決於模板參數的實例化值。這些值必須被知道並最終完成,否則編譯器不知道要生成什麼代碼。