我正在閱讀litb對問題here的回答,他詳細說明了如何創建類模板的專用朋友函數。類模板的朋友函數的明確專業化
我試圖創建一個典範,其做他認爲正是(代碼末):
// use '<>' to specialize the function template with the class template's type
friend std::ostream& operator<< <>(std::ostream& os, const foo<T>& f)
這導致編譯器錯誤:
error: defining explicit specialization ‘operator<< <>’ in friend declaration
顯式聲明專業化中的模板參數不起作用:
friend std::ostream& operator<< <T>(std::ostream& os, const foo<T>& f) // same error
在另一方面,從使用專門使用友元函數模板代替改變確實工作:
template<typename U>
friend std::ostream& operator<<(std::ostream& os, const foo<U>& f) // this works
所以我的問題是:
- 是什麼原因造成第一錯誤?
- 我怎樣才能明確專門化
ostream operator
周圍的類模板專業化?
的Exemplar下面的代碼:
#include <iostream>
// fwd declarations
template<typename T> struct foo;
template<typename T> std::ostream& operator<<(std::ostream&, const foo<T>&);
template<typename T>
struct foo
{
foo(T val)
: _val(val)
{}
friend std::ostream& operator<< <>(std::ostream& os, const foo<T>& f) // error line
//template<typename U>
//friend std::ostream& operator<<(std::ostream& os, const foo<U>& f) // this works
{
return os << "val=" << f._val;
}
T _val;
};
int main()
{
foo<std::string> f("hello world");
std::cout << f << std::endl;
exit(0);
}
啊 - 感謝您爲我澄清! –
@lori歡迎您! – je4d