我想将我的C ++代码转换为Delphi代码。但是我从Delphi编译器得到了这个错误:Declaration of 'callFunction<T>' differs from previous declaration
。
我的C ++代码:
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代码没有运行。
我的德尔福代码:
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吗?感谢。
答案 0 :(得分:5)
我认为你误解了仿制药。关于泛型的重点是你没有在类定义中明确使用类型,所以像
这样的行class procedure Example.callFunction<Integer>(const val: Integer);
不合法。相反,在这种情况下,你不会使用泛型,而是重载函数,比如这样。
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,因为这更有可能是您需要的。
答案 1 :(得分:2)
正如@Dsm所解释的那样,Delphi Generics不支持像C ++模板这样的专业化。但是,一切都不会丢失。您可以使用泛型执行以下操作(尽管它有点违背了使用泛型的目的):
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.
整数= 17
双倍= 3.80000000000000E + 0000
String = Hello