【发布时间】: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<Regions, North, West> RegionSet; RegionSet reg; reg = RegionSet(); if(visible==true){ //work here }else{ //work here } } -
我将 Set 中的大写 S 更改为小写,所以它看起来像这样
typedef set<Regions, North, West> RegionSet;这会产生不同的错误。 E2257 ,预期。编译器在此 typedef 行上给出错误并突出显示两个括号 。这有帮助吗?
标签: delphi c++builder