2013-03-11 3 views
0

Я работаю над проектом C++/Cli, поэтому я определил свою структуру следующим образом.Ошибка C++ CLI C2228

ref struct token_t 
    { 
    public : 
     static TokenTypes_t TokenType;  ///enum class 

     static String^ TokenString; ///enum class 

     static Keyword_t KeywordID; ///enum class 

     static int  IntVal;  
     static char  CharVal;  

     static Operator_t OprID;  ///enum class 

    }; 

Я передал экземпляр этой структуры в качестве параметра функции, но когда я пытался сделать что-то вроде: token.TokenString.pop_back(); он говорит:

Error 11 error C2228: left of '.pop_back' must have class/struct/union 
+0

Я не использую C++/CLI, но я предполагаю, что вам нужно использовать стрелку с управляемыми указателями. – chris

+0

Используйте '->' вместо '.' –

+0

Я не могу сказать, что pop_back не является членом System :: TokenString –

ответ

0

Вы объявите Struct статика где-нибудь? Из вашего кода это не очевидно, если вы это сделали или нет. Если вы этого не сделали, то простая реализация экземпляра не сможет получить статический экземпляр участника. Вам необходимо создать статические элементы где-то. Что-то вроде

struct token_t::TokenString = "foo"; (correct the syntax if wrong) 
+0

ОК, но где я должен это делать?! в функции? –

+0

нет stil не работает.Я отправил код выше –

+0

Я пропустил код, который вы опубликовали. Поместите строку, которую я написал выше в исходном файле на C++, вне любой функции. Обычно вы помещаете эту строку в файл, который определяет класс. Вы не можете поместить его в заголовок, потому что тогда вы получите несколько копий статичности. – Amit

0

Во-первых, система :: String (Строка^вы объявившего) не имеет метода pop_back. Посмотрите его на MSDN для получения дополнительной информации.

Во-вторых, вы объявили его статическим. Вы пытаетесь использовать его с экземпляром. Это не соответствует. Скорее всего, вам не нужны какие-либо статические вещи. Убери это.

Вам также необходимо получить доступ к методам типа XXX^с оператором ->, как если бы это был обычный указатель.

+0

** Вам также нужно получить доступ к методам типа XXX^с оператором ->, как если бы это был обычный указатель. ** i did not get this part , вы можете объяснить больше, пожалуйста, –

+0

Если у вас есть переменная «String^text;», вам нужно будет вызвать «text-> Trim();» с оператором для указателей (->) вместо обычной точки для не указателей. "Text.Trim();" не будет компилироваться. – nvoigt

+0

Я использовал (->), но его просто не работал:/ –

0

Вам необходимо использовать оператор доступа к стрелке. Другое то, что вы, кажется, использовать System.String, как если бы это было станд :: строка из родной C++ стандартной библиотеки ...

+0

любая идея доступа к pop_back? –

+0

Вы не можете получить доступ к pop_back, так как его нет. Используйте API System :: String. –

0

ОК, несколько вещей:

  • String^ является ссылочным типом, вы необходимо использовать ->, а не . при вызове методов на нем.
  • Нет способа pop_back на классе строк.
  • TokenString объявлен static, поэтому надлежащим способом доступа к нему является token_t::TokenString. Если он статичен, он не связан с конкретным экземпляром типа, только с самим типом.
  • У вас есть тип, объявленный как ref struct. Это совершенно верно, но сбивает с толку. ref выигрывает за struct, поэтому у вас есть то же самое, что и у ref class. Если вам нужна структура (т. Е. Тип значения, а не ссылочный тип), вы должны указать value struct token_t. (value class даст вам тот же результат, что и value struct, но это снова запутывает.)
  • Собственными членами класса String являются SubString и Length. Поэтому строка, чтобы удалить последний символ из строки, будет такой: token_t::TokenString = token_t::TokenString->SubString(0, token_t::TokenString->Length - 1);
+0

Ошибка 9 \t ошибка C2227: слева от '-> SubString' должна указывать на класс/struct/union/generic type –