0

我正在开发一个 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
4

4 回答 4

0

您是否在某处声明了结构静态?从您的代码来看,您是否这样做并不明显。如果你没有,那么仅仅 struct 实例化不会让你得到静态成员实例化。您需要在某处实例化静态成员。就像是

struct  token_t::TokenString = "foo"; (correct the syntax if wrong)
于 2013-03-11T05:09:10.260 回答
0

首先, System::String (您声明的 String^ )没有 pop_back 方法。在MSDN上查找以获取更多信息。

其次,您将其声明为静态的。您正在尝试将其与实例一起使用。那不匹配。最有可能的是,您不想要任何静态的东西。去掉它。

您还需要使用 -> 运算符访问 XXX^ 类型的方法,就像它是普通指针一样。

于 2013-03-11T05:51:47.870 回答
0

您需要使用箭头访问运算符。除此之外,您似乎使用 System.String 就好像它是来自本机 C++ 标准库的 std::string ...

于 2013-03-11T05:53:23.027 回答
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);
于 2013-03-11T06:19:18.630 回答