2012-02-07 58 views
1

我瞭解到:nontypes模板參數

  • 無類型模板參數進行一些限制。一般來說,它們可以是常量整數值(包括枚舉)或指向具有外部鏈接的對象的指針。

所以我做了下面的代碼

template <char const* name> 

class MyClass { 
    … 
}; 

char const* s = "hello"; 

MyClass<s> x;   // ERROR: 

此代碼沒有工作,產生錯誤's' is not a valid template argument

我的第二個代碼也沒有工作

2.

template <char const* name> 
class MyClass { 
    … 
}; 

extern char const *s = "hello"; 

MyClass<s> x;  //error 's' is not a valid template argument` 

但奇怪的是這個代碼是罰款

template <char const* name> 
class MyClass { 
    … 
}; 

extern char const s[] = "hello"; 

MyClass<s> x;  // OK 

請告訴什麼是在所有這三個碼的發生?

也告訴如何糾正錯誤,使其他兩個代碼也工作。

+2

啊,舊的'const *'vs'* const'栗子... – 2012-02-07 08:20:10

回答

1

here:「模板參數列表中提供的非類型模板參數是一個表達式,其值可以在編譯時待定」。

你得到了一個問題,因爲你的char指針在前兩個例子中並不是真正的常量。看看這個簡單的例子:

int main() { 
     char const *c = "foor"; 
     std::cout << "c: " << c << std::endl; 
     c = "bar"; 
     std::cout << "c: " << c << std::endl; 
} 

,這將給你

c: foo 
c: bar 
+0

C風格的演員是完全多餘的。 'c'不是'const',它只是指向'char'的'const'數組。 – 2012-02-07 08:40:01

+0

@MatthieuM:你是對的,這是一個殘餘。編輯。 – ezdazuzena 2012-02-07 08:44:26

+0

@ezdazuzena:正如你所說,我得到了一個問題,因爲字符指針在前兩個例子中並不是真正的常量。但是使它們保持不變仍然不起作用。編譯器顯示相同的錯誤。 「你的意思是」模板參數列表中提供的非類型模板參數是一個表達式,它的值可以在編譯時確定「,以及它們如何與只有int和指向外部鏈接的指針的指針相關聯。漂浮等 – 2012-02-07 10:38:05

0

我認爲這個問題是在這裏: 甚至

爲const char * const的P = 「你好」;

只定義一個存儲內存地址的指針變量,編譯時無法確定內存的值。 但是

const char pp [] =「hello」;

編譯器會知道何時編譯內存是「hello」,而不是指向其他地方的指針。 這就是爲什麼

的printf( 「P =%P,& P =%P \ n」 個,P,& P);

將獲得相同的值。 但是

printf(「pp =%p,&pp =%p \ n」,pp,&pp);

不會顯示相同的值。