Явная реализация события интерфейса C++ C++

Я пытаюсь преобразовать код С# в С++/cli. Все шло гладко, пока я не начал переводить явные реализации интерфейсных событий в синтаксис C++/cli.

Скажем, в С# у меня есть этот интерфейс

public interface Interface
{
    public event MyEventHandler Event;
}

Который реализован в классе явным образом, поэтому он не конфликтует с другим членом по его имени:

public interface Class : Interface
{
    event MyEventHandler Interface.Event;

    public event AnotherEventHandler Event;
}

Я пытаюсь преобразовать класс в c++/cli следующим образом:

public ref class Class : public Interface
{
    virtual event MyEventHandler^ Event2 = Interface::Event
    {
    }

    ...
};

Это не будет компилироваться, что даст мне синтаксическую ошибку в части "... = Interface::Event". Кто-нибудь знает, что такое правильный синтаксис, или он даже существует в С++/cli? Я потратил некоторое время на поиски в Интернете, но не нашел ничего полезного.

ОБНОВЛЕНИЕ: Вот полный код С++/cli, демонстрирующий проблему:

public delegate void MyEventHandle();
public delegate void AnotherEventHandle();

public interface class Interface
{
    event MyEventHandler^ Event;
};

public ref class Class : public Interface
{
public:
    virtual event MyEventHandler^ Event2 = Interface::Event
    {
        virtual void add(MyEventHandle^) {}
        virtual void remove(MyEventHandle^) {}
    }

    event AnotherEventHandler^ Event;
};

Вывод ошибки VC++ 2012: «ошибка C2146: синтаксическая ошибка: отсутствует ';' перед идентификатором 'MyEventHandler'"


person edwabr123    schedule 14.03.2013    source источник
comment
Обычно, когда у вас возникают вопросы о сообщениях об ошибках, рекомендуется указать эти сообщения в вопросе.   -  person Arne Mertz    schedule 14.03.2013
comment
Здесь нет компилятора для тестирования, но я ожидаю, что строка будет читать виртуальное событие EventHandle Interface::Event без другого имени или назначения.   -  person nvoigt    schedule 14.03.2013
comment
Обновленный пост с сообщением об ошибке   -  person edwabr123    schedule 14.03.2013
comment
nvoigt, виртуальное событие EventHandle Interface::Event - это старый синтаксис C++/cli, и он не будет компилироваться, сообщая об ошибке перед событием. Синтаксис, по крайней мере, для явного объявления метода: Name = Scope::Name   -  person edwabr123    schedule 14.03.2013


Ответы (1)


Вы должны сделать так, чтобы это выглядело так:

event MyEventHandler^ Event2 {
    virtual void add(MyEventHandler^ handler) = Interface::Event::add {
        backingDelegate += handler;
    }
    virtual void remove(MyEventHandler^ handler) = Interface::Event::remove {
        backingDelegate -= handler;
    }
};
person Hans Passant    schedule 14.03.2013
comment
Ганс, я должен тебе! Я действительно. Большое спасибо! - person edwabr123; 14.03.2013