重载输出流运算符的推荐方法是什么?以下不能做。如果没有为类型 T 定义运算符 <<,则预计编译将失败。
template < class T >
inline std::ostream& operator << (std::ostream& os, const std::vector<T>& v)
{
os << "[";
for (std::vector<T>::const_iterator ii = v.begin(); ii != v.end(); ++ii)
{
os << " " << *ii;
}
os << " ]";
return os;
}
编辑:它确实编译,问题不相关并且在命名空间中。感谢您的帮助。
原文由 Leonid 发布,翻译遵循 CC BY-SA 4.0 许可协议
你真的尝试过这段代码吗?它在 gcc 上运行良好,只需稍加调整
std::vector<T>::const_iterator
,需要声明为typename std::vector<T>::const_iterator
使用 std::copy 和 std::ostream_iterator 可能会更好。
编辑: 类型,依赖类型和类型名 不能全部放在评论中,所以这里是(顺便说一句。这是我的理解,我可能会离开一个国家英里 - 如果是这样,请纠正我!)……
我认为这最好用一个简单的例子来解释..
假设你有一个函数 foo
看起来不错,通常你可以这样做
并打电话
再次,似乎不言自明,但是一些 nuser 出现并这样做
现在
您现在拥有的是一个表达式(乘法),因为 IdiotClass::bob 解析为非类型!
对人类来说,很明显这是愚蠢的,但是编译器无法区分类型和非类型,并且默认情况下在 C++ 中(我认为这是编译器不同的地方), 所有 合格的 _依赖名称_(即 T ::bob) 将被视为 _非类型_。要 明确 告诉编译器依赖名称是真实类型,必须指定
typename
关键字 -即使它是
typedef
也适用。 IE那是不是更清楚了?