template <typename T>
void foo(const T& t)
{}
template <typename T>
class A
{
template <>
friend void foo<T>(const T& t)
{}
};
給出編譯錯誤
"defining explicit specialization ‘foo<T>’ in friend declaration friend void foo<T>(const T& t)"
用gcc和
"error C3637: 'A<int>::foo' : a friend function definition cannot be a specialization of a unction template"
編譯在VS2013
編譯時,當我說話那標準是這麼說的,但爲什麼?我想了解原因(內幕) 有許多文章寫着「明確的專業化不能成爲朋友聲明」,但我不明白爲什麼。有任何想法嗎?
對於給定的代碼,gcc報告'在主模板的聲明中'在非名稱空間範圍'struct A'和'template-id'foo 中的顯式特化。 –
user2079303
對不起,我從其他來源複製粘貼 –
明確的特殊化可防止隱式實例化。每次你爲一組新的模板參數實例化'A'時,你都會添加另一個明確的'foo'特化。如果'foo'已經被隱式地實例化爲相同的模板參數[temp.expl.spec]/6,那麼它是不合格的,不需要診斷。 – dyp