這一次編譯和工作像它應該(非嵌套模板):運營商<<(ostream的和,X)類X嵌套在一個類模板
#include <iostream>
template<typename T> class Z;
template <typename T>
std::ostream& operator<< (std::ostream& os, const Z<T>&) {
return (os << "Z");
}
template<typename T> class Z {
friend std::ostream& operator<< <> (std::ostream& os, const Z&);
};
int main() {
Z<int> z;
std::cout << z << std::endl;
}
這一個不編譯器(gcc 4.4和GCC 4.6,在03和0X模式):
#include <iostream>
template<typename T> class Z;
template<typename T>
std::ostream& operator<< (std::ostream& os, const typename Z<T>::ZZ&) {
return (os << "ZZ!");
}
template <typename T> class Z {
public:
class ZZ {
friend std::ostream& operator<< <> (std::ostream& os, const ZZ&);
};
};
int main() {
Z<int>::ZZ zz;
std::cout << zz << std::endl;
}
錯誤信息是這樣的:
error: template-id ‘operator<< <>’ for ‘std::ostream& operator<<(std::ostream&,
const Z<int>::ZZ&)’ does not match any template declaration
error: no match for ‘operator<<’ in ‘std::cout << zz’
在0X模式的第二個錯誤我ssage是不同的,但意義是相同的。
是否可以做我想做的事情?
編輯顯然,有非推斷上下文這裏,這說明了錯誤信息的一個實例。但是,這個問題仍然存在:對於嵌套在類模板中的類,我可以使用operator<<
嗎?
我正在處理它......第一個錯誤是通過放置「operator <<」,這也使事情變得更加可讀。 –
AudioDroid
可能的重複[如何從C++模板中的方法類型推導出類的類型?](http://stackoverflow.com/questions/3830491/how-to-deduce-class-type-from-method-type-in-c -templates) –
@Matthieu:我很希望看到來自該鏈接的代碼適應了這個問題。我可以把這個答案作爲像我這樣的「普通凡人」的答案嗎(可能是「n.m.」)嗎? ;-) – AudioDroid