2016-11-23 3 views
1

Я пытаюсь использовать делегат в C++/CLI, я говорил this видео, которое находится в C#Делегаты в C++/CLI

#include <iostream> 
#include"stdafx.h" 

using namespace System; 
using namespace System::Collections::Generic; 


public ref class Employee 
{ 
public: 
    Employee() {}; 
    ~Employee() {}; 
public: 
    int ID; 
    String ^name; 
    int Salary; 
    int Experience; 

public: static void Promote(List<Employee^>^ members,promoteDelegate^ promo) 
{ 
    for each (Employee ^emp in members) 
    { 
     if(promo(emp)) 
     Console::WriteLine("{0} is Promoted", emp->name); 
    } 
} 

}; 

delegate bool promoteDelegate(Employee^ emp); 

ref class MyClass 
{ 
public: 
    MyClass() {}; 
    ~MyClass() {}; 

static bool func(Employee^ emp) 
{ 
    return (emp->Salary >= 5000); 
} 

int main(array<System::String ^> ^args) 
{ 
    List<Employee^> ^Employee_List = gcnew List<Employee^>; 
    Employee^ emp1 = gcnew Employee; 
    emp1->name = "Ajanth"; emp1->ID = 0;emp1->Salary = 50000;emp1->Experience = 3; 

    Employee^ emp2 = gcnew Employee; 
    emp2->name = "Aman"; emp2->ID = 1;emp2->Salary = 45000;emp2->Experience = 9; 

    Employee^ emp3 = gcnew Employee; 
    emp3->name = "Ashish"; emp3->ID = 2;emp3->Salary = 60000;emp3->Experience = 4; 

    Employee_List->Add(emp1); 
    Employee_List->Add(emp2); 
    Employee_List->Add(emp3); 

    promoteDelegate ^promoDel = gcnew promoteDelegate(func); 

    Employee::Promote(Employee_List, promoDel); //Error here 
    return 0; 
} 
}; 

Я получаю ошибку компиляции, как показано ниже

«Employee :: Promote» не принимает 2 аргумента. функция «Employee :: Promote» не может быть вызвана с данным списком аргументов.
типы аргументов являются: (System :: Подборки :: Общий :: Список ^, promoteDelegate^

ответ

2

Всегда начинайте с верхней списка ошибок Последующие сообщения получают все менее надежным Первая ошибка, которую вы будете.. get для определения функции Promote(), компилятор еще не знает, что означает promoteDelegate.Когда это вызывает больше ошибок, например, тот, который вы цитировали.

Важным правилом, о котором следует помнить, является то, что в отличие от C# Компилятор C++ использует однопроходную компиляцию. Все типы должны быть объявлены до их использования. Это может быть довольно неудобно, как и здесь, поскольку сам тип делегата использует Employee тип. Проблема курицы и яйцо, которые должны быть решены с упреждающим объявлением:

ref class Employee; // Forward declaration 
public delegate bool promoteDelegate(Employee^ emp); 

public ref class Employee 
{ 
    // etc.. 
} 

Исправьте директивы #includes, а также, stdafx.h должен всегда быть первым включен.