Я подозреваю, что у вас есть определение в другом пространстве имен, чем объявление.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);
}
}