我正在开发一个C ++ / Cli项目,所以我像这样定义了我的结构。
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 :(得分:0)
你是否在某处声明了struct statics?如果您这样做,那么从您的代码中就不明显了。如果你没有,那么单纯的struct instantiation就不会让你获得静态成员实例化。您需要在某处实例化静态成员。像
这样的东西struct token_t::TokenString = "foo"; (correct the syntax if wrong)
答案 1 :(得分:0)
首先,System :: String(您声明的String ^)没有pop_back方法。请在MSDN上查找以获取更多信息。
其次,你宣布它是静态的。您正尝试将其与实例一起使用。那不匹配。最有可能的是,你不需要任何静态的东西。去掉它。
您还需要使用 - >访问XXX ^类型的方法。运算符,好像它是一个普通的指针。
答案 2 :(得分:0)
您需要使用箭头访问运算符。除此之外,您似乎使用System.String,就好像它是来自本机C ++标准库的std :: string ...
答案 3 :(得分:0)
String^
是一种引用类型,在调用方法时需要使用->
而不是.
。pop_back
。static
,因此访问它的正确方法是token_t::TokenString
。如果它是静态的,则它不与该类型的特定实例相关联,只与该类型本身相关联。 ref struct
。这完全有效,但令人困惑。 ref
胜过struct
,因此您拥有的内容与ref class
相同。如果你想要一个结构(即一个值类型,而不是一个引用类型),你应该说value struct token_t
。 (value class
会给你与value struct
相同的结果,但这又会令人困惑。)token_t::TokenString = token_t::TokenString->SubString(0, token_t::TokenString->Length - 1);