2015-10-06 46 views
1

我用下面簡單的例子,工作中爲什麼一個模板類工作的明確的方法專業化沒有它的原型聲明的類

struct foo 
{ 
    template <typename t> 
    void funct(t a , t b) 
    { 
     std::cout << "Primary template called"; 
    } 
}; 

template<> 
void foo::funct<std::string> (std::string a , std::string b) 
{ 
    std::cout << "Specialized"; 
} 

上面的代碼是罰款和運行,但是我有點糊塗了方法聲明的類是:

template<> 
    void foo::funct<std::string> (std::string a , std::string b) 
    { 
     std::cout << "Specialized"; 
    } 

甚至沒有在類內簽名。我的假設下,如果我添加的方法到類的簽名上面的代碼會甚至工作,並使它看起來像這樣不幸的是錯誤的

struct foo 
{ 
    template <typename t> 
    void funct(t a , t b) 
    { 
     std::cout << "Primary template called"; 
    } 

    template<>             ---->Added Extra 
    void funct<std::string> (std::string a , std::string b); ----->Added Extra 
}; 

template<> 
    void foo::funct<std::string> (std::string a , std::string b) 
    { 
     std::cout << "Specialized"; 
    } 

我的問題是爲什麼它這樣的表現?在類/結構之外的方法假定有帶有簽名

funct(std::string a , std::string b); 

的方法,但有not.I將不勝感激,如果有人可以解釋這種行爲。

+0

爲什麼不超載的功能? –

+0

我知道我可以重載功能。我只是試驗和了解模板。我很好奇,爲什麼這發生在處理模板 –

+0

我認爲這是因爲該模板已經聲明瞭該函數。 –

回答

2

顯式的特化會導致一個隱式的實例化,不需要在這裏明確地聲明它。

14.7.3 $ 6明確專業化[temp.expl.spec]

如果一個模板,一個成員模板或類模板的成員 明確專門那麼專業化,應前宣佈 首先使用那種會導致 隱式實例化的特化,在 的每個翻譯單元中發生這種使用;不需要診斷。

而且,顯式專門化不能在類範圍內聲明。

14.7.3 $ 2明確專業化[temp.expl.spec]

一個明確的分工應在封閉 專門的模板命名空間中聲明。

所以,如果你想要你可以在類作用域之外明確地添加顯式的專門化聲明,即使這裏沒有多少意義。

template<> 
void foo::funct<std::string> (std::string a , std::string b); 

LIVE

相關問題