c++ उनल Std:: अधिकतम कॉल करने में समस्या




हाल ही में कॉल (2)

मैंने विजुअल स्टूडियो में अपनी बाइसन जेनरेट की गई फाइलों को संकलित किया और इन त्रुटियों को प्राप्त किया:

... \ position.hh (83): त्रुटि C2589: '(': '::' के दायीं तरफ अवैध टोकन
... \ position.hh (83): त्रुटि C2059: वाक्यविन्यास त्रुटि: '::'
... \ position.hh (83): त्रुटि C2589: '(': '::' के दायीं तरफ अवैध टोकन
... \ position.hh (83): त्रुटि C2059: वाक्यविन्यास त्रुटि: '::'

संबंधित कोड है:

inline void columns (int count = 1)
{
  column = std::max (1u, column + count);
}

मुझे लगता है कि समस्या std :: max के साथ है; अगर मैं std :: max को समकक्ष कोड में बदलता हूं तो अब कोई समस्या नहीं है, लेकिन क्या जेनरेट कोड बदलने के बजाय कोई बेहतर समाधान है?

यहां लिखा गया बाइसन फ़ाइल है:

//
// bison.yy
//

%skeleton "lalr1.cc"
%require "2.4.2"
%defines
%define parser_class_name "cmd_parser"
%locations
%debug
%error-verbose

%code requires {
class ParserDriver;
}

%parse-param { ParserDriver& driver }
%lex-param { ParserDriver& driver }

%union {
    struct ast *a;
    double d;
    struct symbol *s;   
    struct symlist *sl;
    int fn;         
}

%code {
#include "helper_func.h"
#include "ParserDriver.h"
std::string error_msg = "";
}

%token <d> NUMBER
%token <s> NAME
%token <fn> FUNC
%token EOL
%token IF THEN ELSE WHILE DO LET
%token SYM_TABLE_OVERFLOW
%token UNKNOWN_CHARACTER

%nonassoc <fn> CMP
%right '='
%left '+' '-'
%left '*' '/'
%nonassoc '|' UMINUS

%type <a> exp stmt list explist
%type <sl> symlist

%{
extern int yylex(yy::cmd_parser::semantic_type *yylval,
 yy::cmd_parser::location_type* yylloc);
%}

%start calclist
%%

... grammar rules ...

किसी भी शीर्षलेख को शामिल करने से पहले, अपने स्रोत के शीर्ष पर NOMINMAX प्रतीक को परिभाषित करें। Visual C ++ windows.h में कहीं मैक्रोज़ के रूप में min और max परिभाषित करता है, और वे आपके मानक कार्यों के उपयोग में हस्तक्षेप करते हैं।

#define NOMINMAX

आप शायद windows.h सहित कहीं भी हैं, जो max और min नामक मैक्रोज़ को परिभाषित करता है।

आप उन मैक्रोज़ को परिभाषित करने से रोकने के लिए windows.h सहित पहले #define NOMINMAX को परिभाषित कर सकते हैं, या आप #define NOMINMAX अतिरिक्त सेट का उपयोग करके मैक्रो आमंत्रण को रोक सकते हैं:

column = (std::max)(1u, column + count);




bison