使用智能指针实现二维向量相加时遇编译错误求助
问题分析与解决方案
你的代码编译报错的核心原因是模板参数与函数参数类型不匹配,以及对智能指针的传递方式理解有误:
- 你指定模板参数
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
相关产品推荐
相关产品推荐

