12
考慮下面的代碼:解決方法nondeduced上下文
#include <iostream>
template<class T>
struct outer {
struct inner {};
};
template<class T>
std::ostream& operator<<(std::ostream & stream,
typename outer<T>::inner const& value) {
std::cout << "An outer::inner!";
return stream;
}
int main() {
outer<float>::inner foo;
std::cout << foo << std::endl; // does not compile
}
這並不編譯,因爲typename outer<T>::inner
是nondeduced上下文(如所解釋here),這意味着該模板參數型不能推導出由編譯器(閱讀this answer爲什麼)。在我看來,我有兩個選擇,使其工作:
- 移動
inner
外outer
並使其一類模板。我更喜歡這個,因爲對使用代碼的影響較小。 - 添加一個
to_string
- 內部方法。
是否有任何其他的解決方案(這不會導致在使用代碼醜陋的語法)?
+1兩種技術。希望我能給+2。 – Nawaz
「朋友」方法很好。我不知道你可以在'friend'聲明中定義一個函數(對於那些感興趣的人:我只是查看它,它在2003標準的§11.4.5中定義)。 –