2015-05-15 3 views
3

Это очень simliar to this question, однако функция, которую я пытаюсь сделать другом, возвращает C-перечислитель. Я не могу понять правильный синтаксис:Объявление функции функции класса класса и возврата C перечислитель

#include <iostream> 

extern "C" { 
    enum X {ONE}; 
    int foo(); 
    X bar(); 
} 

namespace a { 
class A { 
public: 
    A(int a): a(a) {} 
private: 
    friend int ::foo(); 
    friend X ::bar(); // Doesn't work 
    int a; 
}; 
} 

extern "C" { 
int foo() { 
    a::A a(1); 
    std::cout << a.a << std::endl; 
    return ONE; 
} 
X bar() { 
    a::A a(2); 
    std::cout << a.a << std::endl; 
    return ONE; 
} 
} 

int main() 
{ 
    foo(); // outputs: 1 
    bar(); // doesn't compile 
} 

friend X ::bar(); не работает. Каков правильный синтаксис для этого.

Online demo

main.cpp:20:18: error: 'enum X' is not a class or a namespace 
    friend X ::bar(); 
       ^
main.cpp:20:18: error: ISO C++ forbids declaration of 'bar' with no type  [-fpermissive] 
main.cpp: In function 'X bar()': 
main.cpp:22:7: error: 'int a::A::a' is private 
    int a; 
    ^
main.cpp:35:18: error: within this context 
    std::cout << a.a << std::endl; 
+0

Когда вы говорите, "не работает", что вы имеете в виду под этим? Я предполагаю ошибки компилятора, но это очень помогло бы, если бы вы могли сообщить нам об ошибках. Verbatim, полный и неотредактированный, пожалуйста. –

+0

@JoachimPileborg - извините, обновил ответ с выходом из онлайн-демонстрации –

+0

Я не уверен, что вы можете сделать друзей из функций/типов с помощью C-ссылки, как вы пытаетесь. Возможно, кто-то знает точный ответ. Но если вы столкнулись с сценарием, где это кажется невозможным, вы всегда можете «вызывать» функцию другого без ссылок на C linkage/symbol и сделать _that_ другом. –

ответ

4

Попробуйте добавить скобка для разрешения неоднозначности синтаксического анализа

friend X (::bar)(); 
+1

Yay! Благодаря! Переполнение стека настолько потрясающее. –

+0

[Пример в реальном времени] (https://ideone.com/ytfQkq) – Jarod42

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