尝试添加带有附加智能指针的向量

问题描述 投票:0回答:3

我正在尝试通过使用智能指针来处理内存管理来提高我的编码技能,并创建了一个简单的程序来添加两个 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)的任何类型的指针,但这仍然没有工作。

c++ smart-pointers
3个回答
0
投票

问题:

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
时,我没有指定模板参数类型 - 编译可以从参数中推断出它。


0
投票

问题似乎是您将智能指针与普通的非拥有非智能指针混淆了......

作为参数

T* v1
,编译器和函数需要一个指向 std::unique_ptr<vec2> 对象的
指针

所以你的电话应该是

addVec2(&p_vec1, &p_vec2, &p_vec3)
。在函数内部您需要使用例如
(*v1)->a

或者将函数参数更新为引用而不是指针。


0
投票

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.