重载cmath函数C ++时函数重载错误

时间:2016-08-24 06:32:31

标签: c++ templates overloading

我正在编写一个名为Vector2f的简单C ++类。我有一个名为Vector2f.cpp的类文件和一个名为Vector2f.h的头文件。

我的Vector2f类有一个名为abs的函数,它返回一个新的Vector2f,其中包含原始Vector2f的每个组件的绝对值。我正在使用cmath库。但是当我尝试使用cmath的abs函数时,它认为我指的是一些未定义的函数Vector2f::abs(float)而不是cmath的abs函数。为什么这里会出现命名冲突?不应该C ++能够解决一个名为abs的函数,它接受一个浮点数只在cmath中定义,而不是在Vector2f.h中定义

这是我的代码:

我的标题文件:

//Vector2f.h

#ifndef VECTOR2F_H
#define VECTOR2F_H

class Vector2f
{
private:
    float x;
    float y;

public:
    Vector2f(float x, float y);
    float length();
    float dot(Vector2f r);
    Vector2f normalized();
    Vector2f rot(float angle);
    Vector2f add(Vector2f r);
    Vector2f add(float r);
    Vector2f sub(Vector2f r);
    Vector2f sub(float r);
    Vector2f mul(Vector2f r);
    Vector2f mul(float r);
    Vector2f div(Vector2f r);
    Vector2f div(float r);
    Vector2f abs();
    float getX();
    float getY();

};

#endif // VECTOR2F_H

我的班级档案:

//Vector2f.cpp

#ifndef M_PI
#define M_PI 3.14159265358979323846264338327950288
#endif // M_PI
#include "Vector2f.h"
#include <cmath>

Vector2f::Vector2f(float x, float y)
{
    this -> x = x;
    this -> y = y;
}
float Vector2f::length()
{
    return (float)sqrt(x * x + y * y);
}

float Vector2f::dot(Vector2f r)
{
    return x * r.getX() + y * r.getY();
}

Vector2f Vector2f::normalized()
{
    float length = Vector2f::length();

    float xnormal = x/length;
    float ynormal = y/length;

    return Vector2f(xnormal, ynormal);
}

Vector2f Vector2f::rot(float angle)
{
    double rad = angle * M_PI / 180.0;
    double c = cos(rad);
    double s = sin(rad);

    return Vector2f((float)(x * c - y * s), (float)(x * s + y * c));
}

Vector2f Vector2f::add(Vector2f r)
{
    return Vector2f(x + r.getX(), y + r.getY());
}

Vector2f Vector2f::add(float r)
{
    return Vector2f(x + r, y + r);
}

Vector2f Vector2f::sub(Vector2f r)
{
    return Vector2f(x - r.getX(), y - r.getY());
}

Vector2f Vector2f::sub(float r)
{
    return Vector2f(x - r, y - r);
}
Vector2f Vector2f::mul(Vector2f r)
{
    return Vector2f(x * r.getX(), y * r.getY());
}

Vector2f Vector2f::mul(float r)
{
    return Vector2f(x * r, y * r);
}
Vector2f Vector2f::div(Vector2f r)
{
    return Vector2f(x / r.getX(), y / r.getY());
}

Vector2f Vector2f::div(float r)
{
    return Vector2f(x / r, y / r);
}
Vector2f Vector2f::abs()
{
    //I get the error, "error: no matching function for call to 'Vector2f::abs(float&)'", here
    //when trying to call abs(x) and abs(y)
    float xabs = abs(x); 
    float yabs = abs(y);
    return Vector2f(xabs, yabs);
}
float Vector2f::getX()
{
    return x;
}
float Vector2f::getY()
{
    return y;
}

我的主要档案:

//main.cpp

#include <iostream>
#include "Vector2f.h"

using namespace std;

int main()
{
    Vector2f a(1.0f,2.0f);

    cout<<a.getX()<<','<<a.getY()<<endl;

    cout<<a.abs()<<endl;

    return 0;
}

任何帮助都将不胜感激。

修改

错误讯息:

error: no matching function for call to 'Vector2f::abs(float&)'

at line 80:

float xabs = abs(x);

error: no matching function for call to 'Vector2f::abs(float&)'

at line 81:

float yabs = abs(y);

1 个答案:

答案 0 :(得分:3)

编译器执行abs cmath。然后会发生什么取决于你包含什么以及是否有使用声明(有趣的是在编译器上)。 std中的所有内容都在名称空间std::中定义,因此您必须使用Vector2f Vector2f::abs() { //I get the error, "undefined reference to `Vector2f::abs(float)'", here //when trying to call abs(x) and abs(y) float xabs = std::abs(x); float yabs = std::abs(y); return Vector2f(xabs, yabs); } 限定您的通话。

using std::abs

如果using namespace std之前某处有Vector2d::abs::abs,则您只能使用::absunqualified lookup,因此根据编译器使用Vector2f::abs可能会有效或无法使用声明。 Clang 3.8接受代码,gcc不接受。

PS:我希望函数class SessionsController < ApplicationController skip_authorization_check def update id = params[:id].to_i session[:id] = User::ROLES.has_key?(id) ? id : 0 flash[:success] = "Your new role #{User::ROLES[id]} was set!" end end 计算向量范数,而不是具有原始组件绝对值的向量。但后来我不是数学家。