2015-04-01 43 views
0

我有一个接口用一个简单的签名:铸造具有定义一个接口类型的事件的对象导致内部编译器错误

namespace Serial { 

public interface struct ISerial 
{ 
    uint16_t func1(); 
    uint16_t func2(); 
}; 
} 

,然后一个类类型,它实现接口

namespace Serial { 
    public delegate void MyEventClass(); 

public ref class MySerial sealed : public ISerial { 
public: 
    event MyEventClass MyEvent; 

    MySerial(); 

    ... 
}; 
} 

但在其他地方,作为一个默认参数的功能,我尝试存储到一个类型MySerial作为ISerial^

void 
begin(
    Serial::ISerial ^s = ref new Serial::MySerial 
); 
参考

原因:error C1001: An internal error has occurred in the compiler.

当我从类定义中删除事件时,一切都很好编译。我发现这个错误的信息很少。

+0

您确定这是C++而不是某种Microsoft语言吗? – 2015-04-01 00:57:37

+0

它是Visual C++的组件扩展(通常缩写为C++/CX)。 – 2015-04-01 06:04:57

回答

0

我在VS 2013上对此进行了验证,它可以在一些小的改动下工作(全部基于正常的编译器错误生成,而不是ICE)。我现在没有VS 2015可用,但是如果它仍然存在repros,会记录一个错误。

首先,结构(应该是不变)

namespace Serial 
{ 
    public interface struct ISerial 
    { 
    uint16_t func1(); 
    uint16_t func2(); 
    }; 
} 

那么类(一些改动下面说明):

namespace Serial 
{ 
    public delegate void MyEventClass(); 

    public ref class MySerial sealed : public ISerial{ 
    public: 
    event MyEventClass^ MyEvent; 
    MySerial(){} 
    virtual uint16_t func1() { return 42; } 
    virtual uint16_t func2() { return 42; } 
    }; 
} 

和使用:

void foo() 
{ 
    using namespace Serial; 

    ISerial^ foo = ref new MySerial(); 
} 

基本上你需要将帽子(^)添加到事件类型中,并且您需要添加virtual的方法(但不添加override)。

See more here on MSDN