template
class myclass ;
char const* s = "hello";
myclassx; // error: s is pointer to object with internal linkage
這裡"hello"是個內部鏈結(internal linkage)物件
但是:template
class myclass ;
extern char const s = "hello";
myclassx; // ok
(1) "hello"是字串常量,因為不是「變數」,所以沒有內部、外部鏈結屬性。有內部外部鏈結屬性的是那個s。
(2) c++規定,有const修飾的變數,不但不可修改,還都將具有內部鏈結屬性,也就是只在本檔案可見。(這是原來c語言的static修飾字的功能,現在const也有這個功能了。)又補充規定,extern const聯合修飾時,extern將壓制const這個內部鏈結屬性。於是,extern char cosnt s將仍然有外部鏈結屬性,但是還是不可修改的。
(3) 1.char const* s = "hello";
myclassx; // error: s is pointer to object with internal linkage
我不知道lz標註的error資訊是怎樣得到的,在vs2005下的錯誤資訊是:
invalid template argument for 'myclass', expected compile-time constant expression
主要原因在於template是在編譯時就生成的,而s是乙個指標變數,它的值是執行時可知。
(4) 一下這段話是原作者的感悟,本人有些不是很理解,但是也暫時摘錄在此。
nontype template parameters要求是在編譯或者鏈結時值必須是可知的。對於內部鏈結物件來說,對於其他編譯單元不可見,而在編譯期至少模板的例項化是共享的(blue_zyb說的我很認同),但是如果內部鏈結物件可以作為template argument(模板實參)會發生語義上的錯誤,例如字串文字量(如「abcx」,前面我說是字串常量,這種稱法不準確)
他傳遞給模板的是個指標,而非他的值("abcx").況且如果還有乙個"abcx"的話,也是傳遞的是位址,並且這兩個位址從理論上說是不相同的(即使某些編譯器會做優化,讓其相同)。
但是他對我們使用者來說不相同。但同時我們要說兩個字串文字量的值是相同的。應該共享乙個類的定義(注:這是我們使用者的角度來談),而實際上編譯器無法以值的
方式傳遞這種常量,而以位址的方式傳遞常量。這樣如果編譯器生成了不同的類的實現,這就違法了模板給我的資訊(相同值的非型別型別『nontype template parameters』模板引數生成的物件是共享乙個例項的類的),因此編譯器不應該生成相應的類的實現。
C 中的內部鏈結和外部鏈結
c 中的內部連線與外部連線 apr 22nd,2007 by king 一.在學習內部連線與外部連線之前,必須先弄清楚幾個概念 1.宣告 乙個宣告將乙個名稱引入乙個作用域。在c 中,在乙個作用域中重複乙個宣告是合法的。以下都是宣告 int foo int,int 函式前置宣告 typedef int...
c 內部鏈結 外部鏈結
c 內部鏈結與外部鏈結 2009年03月12日 星期四 11 07 在說內部連線與外部連線前,先說明一些概念。1.宣告 乙個宣告將乙個名稱引入乙個作用域 在c 中,在乙個作用域中重複乙個宣告是合法的 以下都是宣告 int foo int,int 函式前置宣告 typedef int int type...
C 的內部鏈結與外部鏈結問題
在說內部連線與外部連線前,先說明一些概念。1.宣告 乙個宣告將乙個名稱引入乙個作用域 在c 中,在乙個作用域中重複乙個宣告是合法的,以下都是宣告 class bar 類前置宣告 typedef int int typedef 宣告 extern int g var 外部引用宣告 friend tes...