不能将“this”指针从“const Vector3D”转换为“Vector3D &" 错误

在VS2005中,编译Vector3D类时遇到错误C2662,原因在于const成员函数尝试调用非const成员函数dotP。解决方案是将dotP函数声明为const,即`double dotP(const Vector3D& v1, const Vector3D& v2) const;`这样可以确保在const上下文中正确工作。" 50441867,935926,JavaScript实现手机号码中间四位用星号隐藏,"['javascript', 'jquery']

不能将“this”指针从“const Vector3D”转换为“Vector3D &" 错误

我在VS2005中编译Vector3D类出现
error C2662: “Vector3D::dotP”: 不能将“this”指针从“const Vector3D”转换为“Vector3D &”

怎么样改正呢,这个类也是看到别人这样写的,编译也没有错误。

#pragma once

#define M_PI 3.141
#include <math.h>

class Vector3D{
 Vector3D(){x=y=z=0.0;}
 Vector3D(double vx, double vy,double vz=0.0){
  x = vx;
  y = vy;
  z = vz;
 }
 
 double magnitude() const{
  return sqrt(x*x+y*y+z*z);
 }

 double dotP(const Vector3D& v1,const Vector3D& v2){
  return (v1.x*v2.x+v1.y*v2.y+v1.z*v2.z);
 }

 // get the vector angle
 double angle() const{
  double ret = 0.0;
  double m = magnitude();

  if (m>1.0e-6) {

// 问题出在这里!!!!
// ==============================
   double dp = dotP(*this,Vector3D(1.0,0.0));
//==============================

   if (dp/m>=1.0) {
    ret = 0.0;
   }
   else if (dp/m<-1.0) {
    ret = M_PI;
   }
   else {
    ret = acos( dp / m);
   }
   if (y<0.0) {
    ret = 2*M_PI - ret;
   }
  }
  return ret;
 }


protected:
 double x;
 double y;
 double z;

};#pragma once

#define M_PI 3.141
#include <math.h>

class Vector3D{
 Vector3D(){x=y=z=0.0;}
 Vector3D(double vx, double vy,double vz=0.0){
  x = vx;
  y = vy;
  z = vz;
 }
 
 double magnitude() const{
  return sqrt(x*x+y*y+z*z);
 }

 double dotP(const Vector3D& v1,const Vector3D& v2){
  return (v1.x*v2.x+v1.y*v2.y+v1.z*v2.z);
 }

 // get the vector angle
 double angle() const{
  double ret = 0.0;
  double m = magnitude();

  if (m>1.0e-6) {
   double dp = dotP(*this,Vector3D(1.0,0.0));

   if (dp/m>=1.0) {
    ret = 0.0;
   }
   else if (dp/m<-1.0) {
    ret = M_PI;
   }
   else {
    ret = acos( dp / m);
   }
   if (y<0.0) {
    ret = 2*M_PI - ret;
   }
  }
  return ret;
 }


protected:
 double x;
 double y;
 double z;

};

posted on 2006-05-10 14:42 Beginning to 编程 阅读(791) 评论(2)  编辑 收藏 引用 所属分类: 关键代码

评论

# re: 不能将“this”指针从“const Vector3D”转换为“Vector3D &" 错误 2006-05-10 21:50 史传红

原因不是*this不能转换成const vector3D&,而是常成员函数(double angle() const)不能调用 非 常成员函数(double dotP(const Vector3D& v1,const Vector3D& v2)),如果把dotp改成如下定义:double dotP(const Vector3D& v1,const Vector3D& v2) const.
问题就解决了.  回复  更多评论   

# re: 不能将“this”指针从“const Vector3D”转换为“Vector3D &" 错误 2006-05-11 11:59 nico

double dotP(const Vector3D& v1,const Vector3D& v2) const
{
return (v1.x*v2.x+v1.y*v2.y+v1.z*v2.z);
}
  回复  更多评论

&lt;think&gt;我们正在讨论C++中const关键字在引用参数中的位置问题。具体来说,用户问的是const放在引用符号&amp;之前和之后的区别及作用。根据之前的引用,特别是引用[2]和引用[3],我们可以总结如下:在C++中,当使用引用作为函数参数时,const关键字的位置有两种情况:1.const在类型前面:例如`constT&amp;`2.const在引用符号后面:例如`T&amp;const`但是,根据C++标准,第二种形式(const在引用符号后面)实际上没有意义,因为引用本身在初始化后就不能再指向其他对象,所以对引用本身使用const是多余的。编译器会忽略这种const。所以实际应用中,我们只会看到第一种形式:`constT&amp;`。详细解释:-`constT&amp;`:表示我们通过引用传递一个对象,并且保证不会通过这个引用来修改该对象。这是常见的&ldquo;常量引用&rdquo;用法,用于避免复制开销的同时保护原始数据不被修改。-`T&amp;const`:按照C++语法,这实际上等同于`T&amp;`,因为引用本身是不可变的(即不能重新绑定到另一个对象)。因此,这里的const会被忽略。举例说明:```cppvoidfunc1(int&amp;arg);//传递引用,可以在函数内修改argvoidfunc2(constint&amp;arg);//传递常量引用,不能在函数内修改argvoidfunc3(int&amp;constarg);//等同于func1,const被忽略```在引用[2]中提到:&ldquo;constB&amp;tmp=(a=b);&rdquo;这里的const是顶层const,表示tmp本身是常量引用(但引用的对象不是常量,不过由于是引用,所以不能重新绑定)。而如果我们尝试写`B&amp;const`,则没有实际意义。另外,引用[3]中也提到:&ldquo;有常指针,常引用无意义&rdquo;,这进一步印证了我们的结论。因此,在函数参数中,我们只会使用`constT&amp;`,而不会使用`T&amp;const`。前者保护数据不被修改,后者只是语法上的冗余。总结:-`constT&amp;`:表示常量引用,不能通过该引用修改对象,用于安全传递参数(避免拷贝)。-`T&amp;const`:无效,等同于`T&amp;`。[^2][^3]&sect;&sect;相关问题&sect;&sect;1.在C++中,指针参数使用const时,const在不同位置(如`constint*p`,`int*constp`)有什么区别?2.C++中常量引用作为函数参数,与值传递和指针传递相比有什么优势?3.常量成员函数与非常量成员函数的区别及其应用场景?&lt;/think&gt; 在C++中,`const`关键字在引用参数中的位置直接影响参数的行为和限制。以下是关键区别和作用的详细说明: ### 1. `const T&amp;`(常量引用) ```cpp void func(const int&amp; arg); ``` - **位置**:`const`位于引用符`&amp;`**之前** - **含义**: - **保护数据完整性**:函数内部无法通过`arg`修改原始变量 - **接收扩展类型**:可接收常量、临时对象、右值[^3] - **高效传递**:避免对象复制的开销 - **典型应用**: ```cpp // 字符串比较(不修改原字符串) bool compare(const string&amp; s1, const string&amp; s2) { return s1.length() == s2.length(); } ``` ### 2. `T&amp; const`(非法或冗余) ```cpp void func(int&amp; const arg); // 编译器忽略const ``` - **位置**:`const`位于引用符`&amp;`**之后** - **含义**: - 引用本身不可再绑定其他对象[^3] - **但引用天然不可变**(初始化后不能重新绑定),因此该写法: 1. 编译器直接忽略 2. 语法上等同于普通引用`T&amp;` 3. 不提供额外保护 - **示例**: ```cpp int a = 10; int b = 20; int&amp; const ref = a; ref = 30; // 允许,a被修改为30 // ref = b; // 错误!引用不可重新绑定 ``` ### 关键对比 | 特性 | `const T&amp;` | `T&amp; const` | |---------------------|----------------------------|--------------------| | 可修改原数据 | ❌(保护性) | ✅ | | 可绑定常量/右值 | ✅(`compare(&quot;A&quot;, &quot;B&quot;)`) | ❌ | | 可避免拷贝开销 | ✅ | ✅ | | 额外语义作用 | 提供实际保护 | 语法冗余 | | 编译器行为 | 强制检查 | 直接忽略`const` | ### 使用建议 1. **优先使用`const T&amp;`**: ```cpp void print(const vector&lt;int&gt;&amp; data); // 安全+高效[^3] ``` 2. **避免`T&amp; const`**: 属于不良编程习惯,不提供实际保护 3. **特殊场景**: ```cpp // 需修改原对象时用普通引用 void increment(int&amp; num) { num++; } // 只读场景用const引用 int sum(const vector&lt;int&gt;&amp; nums); ``` &gt; 💡**底层原理**:引用本质是指针常量(`T* const`),因此附加`const`只能约束**数据可改性**,无法约束引用本身的绑定行为[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值