簡體   English   中英

為什么在標題的結構中聲明的模板不違反ODR和專業化呢?

[英]Why templates declared in the struct on the header dont violate ODR and specialization does?

我有這個代碼:

#include <iostream>

struct A
{
    template<typename T> bool isImplemented()
    {
                std::cout << "Not Implemented" << std::endl;
                return false;
    }
};

template<> inline bool A::isImplemented<int>()
{
    std::cout << "int Implemented" << std::endl;
    return true;
}

我可以理解為什么模板專門化需要內聯,為了防止ODR被違反,內聯將合並轉換表避免沖突。

但是,為什么我不需要在結構A中的isImplemented上內聯? 也許這個問題可以擴展到,為什么如果方法在頭部的struct / class中聲明它不需要內聯? 據我所知,它會在每個被調用的目標文件(.o)上創建符號,違反ODR,為什么不會發生?

您不需要它有兩個原因:

  • 在類的定義中定義的每個函數都是隱式inline
  • 模板不需要inline關鍵字。 請記住,您的原始功能是模板,而專業化則不是。

這里要強調的是template<typename T> bool isImplemented() 不是函數 它是一個函數的模板,一旦專門化就會存在(作為代碼),就像你使用template<> inline bool A::isImplemented<int>()

這里的inline不是強制性的。 程序編譯並在沒有它的情況下完美運行。

奇怪的是你的struct A不依賴於任何模板參數既不是isImplemented()方法,所以我仍然試圖找出你的意圖。

函數的簡單用法可能如下所示:

int  main( )
{
    A a;

    a.isImplemented< int >( );
    a.isImplemented< double >( );
}

並輸出:

int Implemented
Not Implemented

基本上你可以告訴你從通用的那些明確實現的專業化。 這是你需要的嗎?

編輯:

鑒於對我的回答的評論,我相信原來的問題在這里很好地回答:

暫無
暫無

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

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