我正在尝试通过使用智能指针来处理内存管理来提高我的编码技能,并创建了一个简单的程序来添加两个 2D 向量结构的组件并将其保存到第三个 2D 向量结构。
当我调用 addVec2() 函数时,编译器崩溃了。
实际上将智能指针(指向实际数据结构而不是基元)传递给函数的示例并不多。
有人可以帮忙解决这个问题吗?
谢谢你。
#include <iostream>
#include <memory>
#include <vector>
#define ENDL "\n"
struct vec2
{
int a;
int b;
};
template<typename T>
void addVec2(T *v1, T *v2, T *v3)
{
v3->a = v1->a + v2->a;
v3->b = v1->b + v2->b;
}
int main() {
std::unique_ptr<vec2> p_vec1(new vec2);
p_vec1->a = 1;
p_vec1->b = 2;
std::unique_ptr<vec2> p_vec2(new vec2);
p_vec2->a = 3;
p_vec2->b = 7;
std::unique_ptr<vec2> p_vec3(new vec2);
addVec2<std::unique_ptr<vec2>>(p_vec1, p_vec2, p_vec3);
return 0;
}
我什至尝试使用模板来尝试解决它的问题,抱怨只能将 unique_ptr 类型输入到函数中,而不是仍然指向相同类型(vec2)的任何类型的指针,但这仍然没有工作。
问题:
addVec2
按值接受参数。但是std::unique_ptr
是不可复制的,所以你不能按值传递它们。
立即修复是通过引用接受参数(输入的 const 引用):
template<typename T>
//-------------vvvvvvv-------vvvvvvv-------v----
void addVec2(T const & v1, T const & v2, T & v3)
{
v3->a = v1->a + v2->a;
v3->b = v1->b + v2->b;
}
但在这种情况下你实际上并不需要智能指针:
struct vec2
{
int a;
int b;
};
template<typename T>
void addVec2(T const & v1, T const & v2, T & v3)
{
v3.a = v1.a + v2.a;
v3.b = v1.b + v2.b;
}
int main() {
vec2 v1{ 1, 2 };
vec2 v2{ 3, 7 };
vec2 v3;
addVec2(v1, v2, v3);
}
请注意,当我调用
addVec2
时,我没有指定模板参数类型 - 编译可以从参数中推断出它。
问题似乎是您将智能指针与普通的非拥有非智能指针混淆了......
作为参数
T* v1
,编译器和函数需要一个指向 std::unique_ptr<vec2>
对象的 指针。
所以你的电话应该是
addVec2(&p_vec1, &p_vec2, &p_vec3)
。在函数内部您需要使用例如(*v1)->a
等
或者将函数参数更新为引用而不是指针。
std::unique_ptr 无法复制。 所以你可以使用 std::shared_ptr 而不是 std::unique_ptr
或
template<typename T>
void addVec2(T &v1, T &v2, T &v3)
{
v3->a = v1->a + v2->a;
v3->b = v1->b + v2->b;
}