簡體   English   中英

為什么我可以使用模板函數中的私有方法

[英]Why I can use private methods from template functions

我有模板類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(); } 

為什么我可以使用模板函數中的私有方法?

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

如果無法為模板生成有效的專門化,並且未實例化該模板,則模板格式錯誤,無需診斷。


我很感興趣為什么在調用函數之前我無法看到錯誤

編譯器可以推遲分析,直到實例化函數模板。 盡管如此,這是一個實現定義的行為,您的代碼仍然是不正確的 (§14.6/ p4的延續):

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

GCC演示 (僅在實例化時發出錯誤)
Clang演示 (在沒有實例化的情況下發出錯誤)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM