2014-08-26 7 views
0

В настоящее время следующий код не работает:Друг оператор в другом пространстве имен

namespace inner 
{ 
    struct Test 
    { 
     Test() : n(0) { } 
     friend int ::operator+(const Test& a, const Test& b); 
    private: 
     int n; 
    }; 
} 

int operator+(const inner::Test& a, const inner::Test& b) 
{ 
    return a.n + b.n; 
} 

и ошибка, я получаю

error: 'int operator+(const inner::Test&, const inner::Test&)' should have been declared inside '::' 

     friend int ::operator+(const Test& a, const Test& b); 

                  ^

Я думал qualifing пространства имен будет решить эту проблему, но это не делает , Какое обходное решение?

ответ

1

Вы должны объявить оператора перед его использованием в конструкции.

+0

(Это как раз сообщение об ошибке: вам нужно объявление в '::') – o11c

4

В объявлении друга может вводиться только имя в ближайшее окружение.

Если вы хотите подружиться с функцией в любом другом пространстве имен, вам нужно объявить эту функцию в своем пространстве имен до объявления друга. Как говорится в сообщении об ошибке.

В этом случае вы, вероятно, хотите, чтобы оператор находился в inner, а не в глобальном пространстве имен. Аргумент-зависимый поиск все равно найдет его в выражении, таком как test_a + test_b, даже если это не так.

Смежные вопросы