2013-10-09 68 views
3

我故意使用點和箭頭運算符,但我很困惑,爲什麼它會在我決定將該類作爲模板時進行編譯。爲什麼在編寫模板時會編譯?

編譯:

template <class B> 
struct Boss { 

    bool operator==(Boss & other) { 

    return this.x == other -> x; 

    } 

}; 

int main() { 

} 

不會編譯:

struct Boss { 

    bool operator==(Boss & other) { 

    return this.x == other -> x; 

    } 

}; 

int main() { 

} 
+1

你在試圖編譯哪個編譯器? – dsign

+3

嘗試添加到您的主Boss b1,b2; b1 == b2;這會引發編譯錯誤。你沒有調用的代碼沒有實例化。 – undu

+0

@dsign g ++ -Wall -pedantic Boss.cpp – Kacy

回答

4

模板不完全檢查正確性,如果他們不實例化。他們只是檢查語法。 this.x,雖然在語義上不正確(因爲this不是,並且不能是支持該操作的類型),但它在語法上仍然正確。

+0

我在這兩個例子中都加了'Boss b;'爲主,它沒有效果。 – Kacy

+2

@KacyRaye:你需要調用實際的功能。如果沒有調用類模板的成員函數,則不會實例化。這就是爲什麼,例如,即使vector的某些成員函數和構造函數需要default-constructibility,也可以創建非默認構造類型的std :: vector。 –

+0

當你說類模板的成員函數在被調用之前沒有被實例化,你是什麼意思?類模板的功能說明不要像任何其他功能一樣進入文本區域? – Kacy

1

它編譯,因爲模板直到你使用它纔會被檢查。如果你嘗試在你的main()中做一些有用的事情,它會給你一個編譯錯誤。

+1

他們沒有_fully_檢查。有一些檢查,如果只是爲了可靠地找到模板的結尾。例如。 '{'和'}'必須平衡。 – MSalters