You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用智能指针实现二维向量相加时遇编译错误求助

问题分析与解决方案

你的代码编译报错的核心原因是模板参数与函数参数类型不匹配,以及对智能指针的传递方式理解有误:

  • 你指定模板参数T为std::unique_ptr<vec2>,导致addVec2的参数被推导为std::unique_ptr<vec2>*(即智能指针的指针),但你传递的是std::unique_ptr<vec2>对象,类型完全不兼容。
  • 即便强行匹配类型,函数内v1->a的写法也错误,因为此时v1是指向智能指针的指针,需要两次解引用才能访问vec2的成员。

下面提供几种合理的修正方案:


方案1:传递智能指针的裸指针(简单直接)

利用std::unique_ptr的.get()方法获取其管理的裸指针,直接传递给原模板函数:

#include <iostream>
#include <memory>

#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);

    // 用.get()获取裸指针传递
    addVec2<vec2>(p_vec1.get(), p_vec2.get(), p_vec3.get());

    // 验证结果
    std::cout << "p_vec3->a: " << p_vec3->a << ENDL;
    std::cout << "p_vec3->b: " << p_vec3->b << ENDL;

    return 0;
}

方案2:修改模板函数接受智能指针类型

让模板函数直接接受智能指针对象,利用智能指针重载的->运算符访问成员:

#include <iostream>
#include <memory>

#define ENDL "\n"

struct vec2
{
    int a;
    int b;
};

// 模板参数T为智能指针类型
template<typename T>
void addVec2(const T& v1, const 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(p_vec1, p_vec2, p_vec3);

    std::cout << "p_vec3->a: " << p_vec3->a << ENDL;
    std::cout << "p_vec3->b: " << p_vec3->b << ENDL;

    return 0;
}

方案3:直接使用vec2的引用(更简洁)

如果函数只需要访问vec2的数据,完全不需要关心智能指针,直接传递vec2的引用更高效:

#include <iostream>
#include <memory>

#define ENDL "\n"

struct vec2
{
    int a;
    int b;
};

// 直接接受vec2的引用,避免指针操作
void addVec2(const vec2& v1, const vec2& v2, vec2& 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);

    // 解引用智能指针得到vec2的引用
    addVec2(*p_vec1, *p_vec2, *p_vec3);

    std::cout << "p_vec3->a: " << p_vec3->a << ENDL;
    std::cout << "p_vec3->b: " << p_vec3->b << ENDL;

    return 0;
}

内容的提问来源于stack exchange,提问作者Michael Sipos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 16:57:55