Во-первых, обратите внимание, что в объявлении вашего оператора отсутствует квалификация пространства имен для A:
NAME::A operator * (double lhs, const NAME::A& rhs)
и тогда решающий трюк заключается в добавлении скобок к объявлению друга, как это, как вы предложили в своем "псевдокоде"
friend A (::operator *) (double lhs, const A& rhs);
Чтобы все это скомпилировалось, вам понадобятся некоторые предварительные объявления, получившие следующее:
namespace NAME
{
class A;
}
NAME::A operator * (double lhs, const NAME::A& rhs);
namespace NAME
{
class A {
public:
friend A (::operator *) (double lhs, const A& rhs);
private:
int private_var;
};
}
NAME::A operator * (double lhs, const NAME::A& rhs)
{
double x = rhs.private_var;
}
Александр прав, хотя - вам, вероятно, следует объявить оператор в том же пространстве имен, что и его параметры.