Вот пример кода кода С++, который компилируется и работает нормально:
class A
{
public:
A() {/* empty */}
private:
friend void IncrementValue(A &);
int value;
};
void IncrementValue(A & a)
{
a.value++;
}
int main(int, char **)
{
A a;
IncrementValue(a);
return 0;
}
Однако я хотел бы сделать объявление IncrementValue() статическим, чтобы его нельзя было увидеть или вызвать из другого модуля компиляции:
static void IncrementValue(A & a)
{
a.value++;
}
Выполнение этого, однако, дает мне ошибку компиляции:
temp.cpp: In function ‘void IncrementValue(A&)’:
temp.cpp:12: error: ‘void IncrementValue(A&)’ was declared ‘extern’ and later ‘static’
temp.cpp:8: error: previous declaration of ‘void IncrementValue(A&)’
... и изменение объявления друга для соответствия не помогает:
friend static void IncrementValue(A &);
... поскольку он дает эту ошибку:
temp.cpp:8: error: storage class specifiers invalid in friend function declarations
Мой вопрос в том, есть ли способ в С++ иметь (не-метод) функцию друга, объявленную как static?