C ++ / cli错误C4368:无法将“list”定义为托管“队列”的成员:不支持混合类型

时间:2016-05-06 01:28:59

标签: visual-studio-2010 c++-cli windows-forms-designer dining-philosopher

我是c ++ Gui的新手.. 我正在尝试制作一个简单的窗体来绘制我的餐饮哲学家信号量解决方案

我的信号量头文件

ref class sema4
{
 private:
  int sem_value;
  queue Waiting_List;
 public:
  sema4();
  void wait(HANDLE h);
  void signal();
};

我的信号量cpp

sema4::sema4()
{
 sem_value=1;
}

//suspend the thread 
void sema4::wait(HANDLE h)
{
 sem_value = sem_value - 1;
 if (sem_value < 0)
  {
    Waiting_List.enqueue(h);
    SuspendThread(h);
  }
}

//Resume the thread
void sema4::signal()
{
  sem_value = sem_value + 1;
  if (sem_value <= 0)
   {
    ResumeThread(Waiting_List.dequeue());
   }
}

我的队列头文件

ref class queue
{
 private:
  HANDLE list[20];
  int front;
  int rear;

 public:
  queue();
  void enqueue(HANDLE x);
  HANDLE dequeue();
  bool isempty();
  bool isfull();
 };

队列CPP

queue::queue()
{
  front=-1;
  rear=-1;
}


void queue::enqueue(HANDLE x)
{
  if(isfull())
   {
     cout<<"queue is full";
   }
 else
  {
    if(front==-1)
            front=0;

    rear=(rear+1)%20;
    list[rear]=x;
  }
} 


bool queue::isfull(){
  if (front==(rear+1)%20)
        return true;
  return false;
}


HANDLE queue::dequeue(){
  if(isempty())
   {
      cout<<"queue is empty";
      return NULL;
   }
  else
   {
    HANDLE x =alist[front];
    if (front==rear)
        front=rear=-1;
    else front = (front + 1) % 20;
   }
 }

bool queue::isempty()
{
  if((front == rear) && (rear == -1))
  {
    return true;
  }
return false;
}

我一直收到错误C4368:无法将'list'定义为托管'队列'的成员:不支持混合类型 我没有使用c ++ windows窗体的实际经验

1 个答案:

答案 0 :(得分:2)

简单的答案

您获得的编译错误是因为^是托管类型。托管类型需要使用gcnew声明,并使用{{1}}创建。

更复杂的答案

您所写的不是C ++代码。这是一种名为C ++ / CLI的语言,用于在.Net托管语言(如C#)和非托管语言(如C和C ++)之间进行互操作。因此,它具有C ++的所有复杂性,C#的所有复杂性,以及它自己的一些额外功能。

当你刚刚学习时,请选择其中一个,然后继续学习。如果要编写托管代码,请学习C#。如果要编写非托管代码,请学习C ++。在你还在学习的时候不要处理C ++ / CLI。