2015-07-27 3 views
0

Я преобразовываю выражение Delphi, замеченное ниже, в C++ Builder. Мой код C++ Builder генерирует сообщение об ошибке E2299. Я разместил полный текст для описания этой ошибки ниже. Можете ли вы порекомендовать изменение моего кода на C++, чтобы это работало.Преобразование команды Delphi в C++ Builder

//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]: тип index integerConstant спецификаторы;

где:

PropertyName это любой допустимый идентификатор

[индексов] является необязательным, и представляет собой последовательность деклараций параметров, разделенных точкой с запятой

Каждая декларация параметр имеет вид Identifier1, ..., identifiern: type

тип должен быть предопределенным или ранее объявленным идентификатором типа. То есть объявления свойств, такие как свойство Num: 0..9 ..., являются недопустимыми.

предложение index integerConstant является необязательным.

спецификаторы представляют собой последовательность чтения, записи, хранения, по умолчанию (или nodefault) и реализуют спецификаторы.

Каждая декларация собственности должна иметь как минимум один спецификатор чтения или записи.

редактировать ниже:

Проблема была ЬурейеЕ показано ниже не будет компилировать внутри функции C++ Builder. У меня была настройка typedef в функции CheckRegion.

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) 
{ 
+0

Можете ли вы показать MCVE, чтобы обеспечить контекст. –

+0

Предполагаю, что у вас нет этих строк в * одном и том же * файле, верно? –

+0

Похоже, ошибка компилятора в том, что текст ошибки для Delphi E2299. Текст для C++ E2299 совершенно другой: http://docwiki.embarcadero.com/RADStudio/XE8/en/E2299_Cannot_generate_template_specialization_from_'specifier'_(C%2B%2B) –

ответ

1

Вы используете typedef Set ... в другом месте.

Вы можете использовать typedef Set <..., если вы используете НЕ местный enum Regions

//--------------------------------------------------------------------------- 
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) 
{ 
    [...] 
} 

Y ожно использовать typedef Set <..., если вы используете глобальную enum Regions

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

FWIW это пахнет ошибкой компилятора. Я не вижу причин, по которым код афера не должен быть действительным. Почему шаблон не должен быть специализированным внутри функции? –

+0

@DavidHeffernan: Я тоже этого не знаю. Вы можете использовать 'typedef Set

+0

Я не вижу причин для кода в комментариях (!!) не быть допустимым C++. –

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