繁体   English   中英

重载*运算符未给出匹配错误

[英]Overloading * operator gives no match error

嗨,我正在尝试创建一个光线跟踪器,以渲染基于三角形的多边形模型。

我在point3d.h中有一个指向3D的结构,其中包含x,y和z坐标。

#ifndef __POINT3D_H__
#define __POINT3D_H__

#include <iostream>

using namespace std;

struct Point3D
{
    double x;
    double y;
    double z;

    Point3D() : x(0.0), y(0.0), z(0.0) {}
    Point3D(const double & nx, const double & ny, const double & nz) : x(nx), y(ny), z(nz) {}

    Point3D operator+(const Point3D & rhs) const { 
     return Point3D(x + rhs.x, y + rhs.y, z + rhs.z); }

    Point3D operator-(const Point3D & rhs) const { 
     return Point3D(x - rhs.x, y - rhs.y, z - rhs.z); }

    Point3D operator*(double val) const { 
     return Point3D(x * val, y * val, z * val); }

    Point3D operator/(double val) const { 
     return Point3D(x / val, y / val, z / val); }

    Point3D operator+=(const Point3D & rhs) { 
     x += rhs.x; y += rhs.y; z += rhs.z; return *this; }

    Point3D operator-=(const Point3D & rhs) { 
     x -= rhs.x; y -= rhs.y; z -= rhs.z; return *this; }

    Point3D operator*=(double val) { 
     x *= val; y *= val; z *= val; return *this; }

    Point3D operator/=(double val) { 
     x /= val; y /= val; z /= val; return *this; }

    void print() {
     cout << '(' << x << ',' << y << ',' << z << ')'; 
    }
};

#endif

在这里,我尝试使用*运算符将两个Point3D一起使用

Point3D phong(Point3D mColor, Point3D lColor, Point3D L, Point3D N, Point3D R, Point3D V) 
{
 Point3D k(1.0, 1.0, 1.0);
 Point3D ambient = mColor * k.x;

 Point3D diffuse_angle = ((N * L) / (length(N) * length(L)));
 Point3D diffuse = lColor * k.y * diffuse_angle; 

 Point3D specular_angle = ((R * V) / (length(R) * length(V)));
 double specular_x = pow(specular_angle.x, 100.0);
 double specular_y = pow(specular_angle.y, 100.0);
 double specular_z = pow(specular_angle.z, 100.0);
 Point3D specular_power(specular_x, specular_y, specular_z);
 Point3D specular = lColor * k.z * specular_power;

 return ambient + (lColor * (diffuse + specular)); 
}

当我尝试将多个两个Point3D在一起时,出现了不匹配错误。 这是代码失败的地方。 我觉得这是一个简单的错误,但我无法弄清楚。 我包含Point3d头文件,如下所示:#include“ point3d.h”。

Point3D operator*(double val) const

您只有这个版本, Point3D * double和其他版本,但是您正在尝试将此操作符用于Point3D * Point3D Point3D不能从double隐式构造,因此这就是为什么您有编译错误的原因。

Point3D operator*(double val) const { 

这是用于Point3D * double乘法。 然后

N * L

您正在尝试做Point3D * Point3D

您可以通过为类提供适当的operator*来纠正此问题,或者通过单参数构造函数提供从双精度到类的转换。 虽然我更喜欢前者。

您需要这样的功能

Point3D operator *(Point3D &temp) const {

}

由于您没有将两个3d点相乘的功能,因此会出现错误,请尝试添加此功能。

您需要一个用于Point3D * Point3D操作的函数,该函数不能用于Point3D::operator*(double val)的调用。 如:

Point3D operator*(const Point3D & rhs) const {
    return Point3D(x * rhs.x, y * rhs.y, z * rhs.z); }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM