2014-09-13 103 views
4

我有模板類MyClass的爲什麼我可以使用從模板功能

template <class T> 
class MyClass 
{ 
public: 
    MyClass() { } 
private: 
    void PrivateFunction() { 
    std::cout << "Message From Private Function" << std::endl; 
    } 
}; 

現在,當我試圖使用PrivateFunction()內的另一個功能,編譯器會報告錯誤,但是當我試圖同裏面的模板私有方法函數編譯器不顯示任何錯誤。

  1. 編譯器不報告錯誤。

    template <class T> 
    void f() 
    { 
        MyClass<int> a; 
        a.PrivateFunction(); 
    } 
    
  2. 編譯器報告錯誤。

    void f() 
    { 
        MyClass<int> a; 
        a.PrivateFunction(); 
    } 
    
+0

你打電話模板函數'F()'了嗎? – billz 2014-09-13 10:41:14

+0

是的只有在這種情況下,我得到的錯誤,但我有興趣爲什麼我不能在調用函數之前看到錯誤。 – 2014-09-13 10:42:23

+1

您是否得到錯誤取決於編譯器。即使「f」從未實例化,clang也會顯示1和2的錯誤。 – hvd 2014-09-13 10:58:28

回答

13

爲什麼我可以使用從模板函數的私有方法?

你不能。 §14.6[temp.res]/p4:

如果沒有爲模板生成有效的特化,並且該模板未實例化,則模板不合格,不需要診斷。


我很感興趣,爲什麼我不能調用該函數

編譯器,直到函數模板實例可推遲分析之前看到的錯誤。不過,這是一個實現定義的行爲,你的代碼保持形成不良(在§14.6/ P4的延續):

[:如果一個模板實例,錯誤將被診斷根據本標準的其他規則。 確切地說,當這些錯誤被診斷出來是一個實施質量問題。 - 注完]

GCC demo(僅問題實例上的錯誤)
Clang demo(發出錯誤沒有實例化)

+0

感謝Piotr,現在很清楚。 – 2014-09-13 10:46:43

+1

這不是很準確。該模板不合格,不需要診斷,因此如果需要,編譯器可以自由診斷。不管它是否是實現問題的質量,並且至少有一個編譯器(Clang)不需要實例化'f()'就可以診斷錯誤。 – 2014-09-13 11:32:27

+0

@ T.C .:謝謝,更新 – 2014-09-13 11:43:07