Вот некоторые C++ пример кода, который компилируется и работает отлично:Можно ли объявить функцию друга статичной?
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
Мой вопрос, есть ли способ в C++, чтобы иметь (не метод) друга функцию, которая объявляется статической?
", чтобы его нельзя было увидеть или вызвать из другой единицы компиляции". Зачем вам это нужно? (Я искренне заинтересован.) –
Было бы странно, потому что функция friend является частью API класса, поэтому вы говорите, что хотите, чтобы класс имел * разные * API в разных исходных файлах, в соответствии с тем, как это статическая функция реализуется в каждом. –
помните, что вы обходите частный/защищенный механизм, потому что вы включили любой блок компиляции для предоставления статической версии IncrementValue, которая теперь может делать все, что захочет. –