2017-01-18 5 views
1

Я хочу преобразовать свой код на C++ в код Delphi. Но я получаю эту ошибку от компилятора Delphi: Declaration of 'callFunction<T>' differs from previous declaration.
Мой C++ код:Delphi Generics: E2037: Декларация 'XXX' отличается от предыдущего объявления

class Example 
{ 
public: 
    template<typename T> 
    static void callFunction(const T value); 
}; 

template<> 
void Example::callFunction<int>(const int value) 
{ 
    cout << "Integer = " << value << endl; 
} 

template<> 
void Example::callFunction<double>(const double value) 
{ 
    cout << "Double = " << value << endl; 
} 

template<> 
void Example::callFunction<char*>(char* const value) 
{ 
    cout << "Char* = " << value << endl; 
} 

int main() 
{ 
    Example::callFunction<int>(17); 
    Example::callFunction<double>(3.8); 
    Example::callFunction<char*>("Hello"); 

    return 0; 
} 

Этот код выполняется успешно. Но мой код Object Pascal не работает.
Мой Delphi код:

type 
    Example = class 
    public 
    class procedure callFunction<T>(const val: T); 
    end; 

{ Example } 

class procedure Example.callFunction<Integer>(const val: Integer); 
begin 
    Writeln('Integer'); 
end; 

class procedure Example.callFunction<Double>(const val: Double); 
begin 
    Writeln('Double'); 
end; 

class procedure Example.callFunction<PChar>(const val: PChar); 
begin 
    Writeln('PChar'); 
end; 

begin 
    Example.callFunction<Integer>(17); 
    Example.callFunction<Double>(3.8); 
    Example.callFunction<PChar>('Hello'); 

    Readln; 
end. 

Как я могу конвертировать мой C++ код в Delphi код? Какова причина ошибки? Могу ли я преобразовать свой код в Delphi, как это? Благодарю.

+2

Шаблоны и дженерики совершенно разные. Дженерики Delphi не имеют ничего похожего на специализированную специализацию на C++. Это выглядит как искусственная проблема, созданная с целью задать вопрос. Поэтому вам может потребоваться сделать его более реалистичным, чтобы получить хорошие рекомендации. –

ответ

2

Как объяснил @Dsm, Delphi Generics не поддерживает специализацию, например C++ Templates. Однако все не потеряно. Вы можете сделать следующее с дженериков (хотя это своего рода поражения цели с помощью дженериков):

program Project1; 

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    System.SysUtils; 

type 
    Example = class 
    public 
    class procedure callFunction<T>(const value: T); 
    end; 

class procedure Example.callFunction<T>(const value: T); 
begin 
    if TypeInfo(T) = TypeInfo(Integer) then 
    WriteLn('Integer = ', PInteger(@value)^) 
    else 
    if TypeInfo(T) = TypeInfo(Double) then 
    WriteLn('Double = ', PDouble(@value)^) 
    else 
    if TypeInfo(T) = TypeInfo(String) then 
    WriteLn('String = ', PString(@value)^); 
end; 

begin 
    Example.callFunction<Integer>(17); 
    Example.callFunction<Double>(3.8); 
    Example.callFunction<String>('Hello'); 
    ReadLn; 
end. 

Integer = 17
Double = 3.80000000000000E + 0000
String = Hello

5

Я думаю, что вы неправильно понимаете дженерики. Весь смысл в том, что дженерики вы явно не использовать тип в определении класса так строк вроде

class procedure Example.callFunction<Integer>(const val: Integer); 

не являются законными. Вместо этого в этом случае вы не будете использовать generics, но перегруженные функции, как это.

type 
    Example = class 
    public 
    class procedure callFunction(const val: integer); overload; 
    class procedure callFunction(const val: double); overload; 
    class procedure callFunction(const val: string); overload; 
    end; 

{ Example } 

class procedure Example.callFunction(const val: Integer); 
begin 
    Writeln('Integer'); 
end; 

class procedure Example.callFunction(const val: Double); 
begin 
    Writeln('Double'); 
end; 

class procedure Example.callFunction(const val: string); 
begin 
    Writeln('string'); 
end; 

begin 
    Example.callFunction(17); 
    Example.callFunction(3.8); 
    Example.callFunction('Hello'); 

    Readln; 
end. 

Обратите внимание, что я использовал строку, а не PChar, так как это более вероятно, что вам нужно.

Смежные вопросы