c++ - 如何重载 << 运算符以使用模板函数将元素添加到 vector 中? (c++)

标签 c++ templates vector operators overloading

我正在为学校做一个项目,我的老师希望我们重载“<<”运算符,以便它向 vector 添加元素。他还希望我们使用模板,以便它可以用于任何类型的元素。

这是我的头文件代码:

template<typename T>
vector<T>& operator<<(vector<T>& v, const T element) {
    v.push_back(element);
    return v;
}

这是我要运行的:

v1 << "Atlanta" << "Dallas" << "Chicago" << "Boston" << "Denver";

我得到的错误是:

error C2676: binary '<<': 'std::vector<std::string,std::allocator<_Ty>>' does not define this operator or a conversion to a type acceptable to the predefined operator

谁能帮我看看为什么这不起作用?我正在使用最新版本的 visual studio,并且我已经将我的文件正确添加到解决方案和所有内容中。当我将“const T element”替换为“const string element”一段时间时,它工作了一段时间,但一旦我再次添加实现,它就不起作用了。感谢您的建议。

编辑:感谢您的帮助,这是最终为我工作的答案:

template<typename T, typename U>
vector<T>& operator<<(vector<T>& v, const U& element) {
    v.push_back(element);
    return v;
}

最佳答案

"Atlanta" 之类的字符串文字不是 std::string 类型(它们是 char 的数组),而是您的函数要求 vector 元素类型和运算符右侧参数类型为同一类型。

如果你允许右边的参数类型不同,那么它就可以工作,例如:

template<typename T, typename U>
std::vector<T>& operator<<(std::vector<T>& v, U&& element) {
    v.emplace_back(std::forward<U>(element));
    return v;
}

请注意,我将参数移动到 vector 中以避免不必要的深层复制,例如std::string 按值传入。

编辑:更改为使用 emplace_back,如评论中所述

关于c++ - 如何重载 << 运算符以使用模板函数将元素添加到 vector 中? (c++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50241707/

相关文章:

c++ - 在 Ubuntu QT 上构建时出现 'QMetaObject::connectSlotsByName: No matching signal for' 错误

c++ - vector 初始化期间出现未知应用程序故障

python - 如何在 Python 中以矢量化方式将具有两个标签 +1 和 -1 的数据集转换为热矢量表示?

c++ - 调用 pthread_create() 时出现段错误 C++ Linux

c++ - 单引号防止 bindValue 替换占位符标记

c++ - OpenCV 束调整

c++ - 区分两个包扩展

c++ - 引用限定的成员函数作为模板参数?

c++ - 模板语法帮助

c++ - 如何在没有其他变量的情况下获得当前位置?