перегрузка оператора вне класса! - PullRequest
2 голосов
/ 08 ноября 2010

Когда я пытался разделить объявление и реализацию оператора, не являющегося членом, перегруженным, я получил ошибку LNK2001 в VC2010, мой код был таким:

-foo.h-

class A
{
public:
    A(float x);
    float x;
};
A operator +(const A&, const A&);

-foo.cpp-

A::A(float x)
{
    this->x = x;
}

A operator +(const A& lh, const A& rh)
{
    return A(lh.x + rh.x);
}

поэтому, как только я использую операцию '+', ошибка выкачивается, но если я удалю объявление в заголовочном файле, ошибок LNK2001 не будет .. Я не могу понять, почему ..

Ответы [ 3 ]

5 голосов
/ 08 ноября 2010

Я подозреваю, что у вас есть определение в другом пространстве имен, чем объявление.ADL находит объявление (поскольку оно находится в том же пространстве имен, что и класс), и затем вы получаете неразрешенную внешнюю ошибку во время ссылки.

например

-foo.h-

namespace aspace
{
  class A
  {
  public:
      A(float x);
      float x;
  };
  A operator +(const A&, const A&);
}

-foo.cpp-

#include "foo.h"
using namespace aspace;

A::A(float x)
{
    this->x = x;
}

A operator +(const A& lh, const A& rh)
{
    return A(lh.x + rh.x);
}

выдаст описанную вами ошибку.Решение состоит в том, чтобы поместить определение operator+ в правильное пространство имен:

namespace aspace
{
  A operator +(const A& lh, const A& rh)
  {
      return A(lh.x + rh.x);
  }
}
0 голосов
/ 08 ноября 2010

Измените свой прототип на (если вы настаиваете на сохранении определения оператора + во вложенном пространстве имен по любой причине)

0 голосов
/ 08 ноября 2010

Я не вижу ничего плохого в представленном вами коде.

Вы уверены, что это именно тот код, который у вас есть?

Если это так, то, похоже, единственное объяснение состоит в том, что вам каким-то образом удалось не иметь [foo.cpp] в вашем проекте Visual Studio, если вы используете Visual Studio.

При использовании инструментов командной строки соответствующая вещь не будет включать [foo.obj].

Если эти комментарии не помогли, можете ли вы создать небольшую программу с одним файлом, которая показывает проблему?

Приветствия

...