【问题标题】:Convert Delphi Set command to C++Builder将 Delphi Set 命令转换为 C++Builder
【发布时间】:2015-07-27 15:08:39
【问题描述】:

我正在将下面看到的 Delphi 表达式转换为 C++Builder。我的 C++Builder 代码生成错误消息 E2299。我把这个错误描述的全文放在下面。您能否建议更改我的 C++ 代码以使其正常工作。

//Delphi
TYPE
Regions   = (North,South,East,West);
RegionSet = SET OF Regions;
//C++Builder
enum Regions { North, South, East, West };
typedef Set<Regions, North, West> RegionSet;

E2299 无法从“Set”生成模板特化

您需要在程序中添加一个属性。

属性的声明指定了名称和类型,并至少包含一个访问说明符。属性声明的语法是:

property propertyName[indexes]:类型索引整数常量说明符;

在哪里:

propertyName 是任何有效的标识符

[indexes] 是可选的,是由分号分隔的参数声明序列

每个参数声明的形式为 identifier1, ..., identifiern: type

type 必须是预定义的或先前声明的类型标识符。也就是说,像 property Num: 0..9 ... 这样的属性声明是无效的。

索引 integerConstant 子句是可选的。

specifiers 是一系列读、写、存储、默认(或无默认),并实现了说明符。

每个属性声明必须至少有一个读或写说明符。

在下面编辑:

问题是下面看到的 typedef 不能在 C++Builder 函数中编译。我在 CheckRegion 函数中设置了 typedef。

void __fastcall TForm1::CheckRegion( bool visible ){ 
//C++Builder 
enum Regions { North, South, East, West }; 
typedef Set<Regions, North, West> RegionSet; 
}    

解决方案是将 typedef 移动到主窗体的顶部,就在 TForm1 *Form1;如下所示。

//--------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
// use "typedef" here
enum RegionsCpp {NorthCpp, SouthCpp, EastCpp, WestCpp };
typedef Set<RegionsCpp, NorthCpp, WestCpp> RegionSetCpp;
//--------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{

【问题讨论】:

  • 你能否展示一个 MCVE 来提供上下文。
  • 我假设您在 一个且相同的文件中没有这些行,对吧?
  • 看起来像一个编译器错误,因为错误文本是针对 Delphi E2299 的。 C++ E2299 的文本完全不同:docwiki.embarcadero.com/RADStudio/XE8/en/…
  • 这是我要编译的测试函数。这会产生 E2299 错误。我的项目中有 .PAS 文件。这可能与某些 Delphi 代码有冲突。我不知道这个错误来自 Delphi 编译器。 void __fastcall TForm1::CheckRegion( bool visible ){ //C++Builder enum Regions { North, South, East, West }; typedef Set&lt;Regions, North, West&gt; RegionSet; RegionSet reg; reg = RegionSet(); if(visible==true){ //work here }else{ //work here } }
  • 我将 Set 中的大写 S 更改为小写,所以它看起来像这样 typedef set&lt;Regions, North, West&gt; RegionSet; 这会产生不同的错误。 E2257 ,预期。编译器在此 typedef 行上给出错误并突出显示两个括号 。这有帮助吗?

标签: delphi c++builder


【解决方案1】:

你在错误的地方使用了typedef Set ...

如果您使用本地enum Regions

,则可以使用typedef Set &lt;...
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClick(TObject *Sender)
{
 enum Regions {North, South, East, West };
 // You can use "enum" here, but not "typedef Set <..."
 typedef Set<Regions, North, West> RegionSet;
 // next typedef is OK
 typedef int NumberOfParts;
}

Delphi 你可以在这里毫无问题地使用 TYPE

procedure TForm1.FormClick(Sender: TObject);
TYPE
 Regions = (North, South, East, West );
 RegionSet = SET OF Regions;
begin
 [...]
end;

以下 C++ Builder 将起作用

#include <vcl.h>
#pragma hdrstop
#include "Enum.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
enum Regions {North, South, East, West };
// use "typedef" here
typedef Set<Regions, North, West> RegionSet;
// also works
// typedef System::Set<Regions, North, West> RegionSet;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClick(TObject *Sender)
{
  [...]
}

如果您使用全局enum Regions,则可以使用typedef Set &lt;...

#include <vcl.h>
[...]
TForm1 *Form1;
enum Regions {North, South, East, West };
[...]
//--------------------------------------------------------------
void __fastcall TForm1::FormClick(TObject *Sender)
{
 typedef Set<Regions, North, West> RegionSet;
}

【讨论】:

  • FWIW 这对我来说就像一个编译器错误。我看不出提问者的代码无效的任何原因。为什么不应该在函数内部专门化模板?
  • @DavidHeffernan:我也不知道。如果enum Regions {North... 是全局定义的,您可以使用`typedef Set
  • 我看不出 cmets (!!) 中的代码不是有效的 C++ 的原因。
猜你喜欢
  • 2013-10-30
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-08
相关资源
最近更新 更多