2016-11-23 24 views
1

我想在C++/CLI使用委託,我提到this視頻這是在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」不能用給定的參數列表調用。
參數類型有:(系統::收藏集::一般::名單^,^ promoteDelegate

回答

2

始終從錯誤列表的頂部開始後來得到的消息越來越不可靠的第一個錯誤,你會。得到的是對促進()函數的定義,編譯器還不知道什麼promoteDelegate手段。然後導致更多的錯誤,比如你引用的一個。

重要的規則要記住的是,很不像C#中, C++編譯器使用single-pass編譯,所有類型必須在使用之前聲明,這可能非常尷尬,就像它在這裏一樣,因爲委託類型本身使用Employee類型。先有雞還是先有蛋的問題,必須以向前聲明來解決:

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

public ref class Employee 
{ 
    // etc.. 
} 

解決您的#includes爲好,stdafx.h中必須始終首次列入。