在我类

generic <class T>
public ref class CFifo
{
public:
  enum class EnumResult
  { ... }

  EnumResult AddData (int i_iStart, int i_iLength, array<T>^ i_aData);
  ...
}

我收到编译器崩溃(“c/c++优化编译器已停止工作”),错误为c1001,并提供了简化类的建议。该故障发生在.cpp中的return行:
generic <class T>
CFifo<T>::EnumResult CFifo<T>::AddData (int       i_iStart,
                                        int       i_iLength,
                                        array<T>^ i_aData)
{
...
  return CResult<EnumResult>::TraceMsg (ms_tracesource, TraceEventType::Error, EnumResult::Error_MutexTimeout, __FUNCTION__"()", "timeout at receiving mutex.");
CResult类是另一个通用类:
generic <class TResult> where TResult : value class  // value class constraint is not necessary
public ref class CResult abstract sealed

我在其他类中使用同一行CResult<EnumResult>::TraceMsg没有问题。

我可以无错误地创建和使用EnumResult变量,因此我认为将这种类型传递给通用类CResult也应该起作用。

谁能解释为什么编译器崩溃以及如何修复它?谢谢。

最佳答案

发现失败:

这是value class中的generic <class TResult> ref class CResult约束。
一旦删除它,编译器崩溃就消失了。奇怪的。

我必须修改CResult中的代码:

return static_cast<TResult>(iResult);


return static_cast<TResult>(System::Enum::ToObject (TResult::typeid, iResult));

因为我不再能够直接从int转换为TResult,由于value class的限制,以前可以这样做。

10-07 20:30