These are the errors/warnings that g++ is putting out and below each is the relevant code. Any help with clearing these errors up or shedding some light on them would be greatly appreciated. Thank you!
g++ error:
id31.cpp: In function ‘php_var array(int, ...)’:
id31.cpp:462: warning: cannot receive objects of non-POD type ‘class php_var’ through ‘...’; call will abort at runtime
id31.cpp:480: warning: cannot receive objects of non-POD type ‘class php_var’ through ‘...’; call will abort at runtime
relevant code:
#include <stdarg.h>
php_var array(int key = 0, ...)
{
va_list ap;
va_start(ap, key);
php_var arr;
arr.to_array();
int i = 0;
for(int i = 0; i < key / 2; ++i)
{
php_var key2 = va_arg(ap, php_var);
if(key2 == -1)
{
bool found = false;
for(;;)
{
for(i = 0;i < arr.keys.size(); ++i)
{
if(arr.keys[i] == (php_var) i)
found = true;
}
if(found)
++i;
else
break;
}
key2 = i;
}
php_var val = va_arg(ap, php_var);
arr.keys.push_back(key2);
arr.data.push_back(val);
};
va_end(ap);
retu开发者_如何学Pythonrn arr;
}
gcc error:
id31.cpp: In function ‘php_var substr(php_var, php_var, php_var)’:
id31.cpp:511: error: ambiguous overload for ‘operator-’ in ‘str.php_var::container.std::basic_string<_CharT, _Traits, _Alloc>::length [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]() - pos’
id31.cpp:511: note: candidates are: operator-(size_t, int) <built-in>
id31.cpp:511: note: operator-(size_t, double) <built-in>
id31.cpp:511: note: operator-(size_t, float) <built-in>
id31.cpp:511: note: operator-(size_t, unsigned int) <built-in>
id31.cpp:511: note: operator-(size_t, long int) <built-in>
Relevant code:
php_var substr(php_var str, php_var pos, php_var len)
{
if(len == 0)
len = str.container.length() - pos;
return (php_var) str.container.substr(pos, len);
}
php_var substr(php_var str, long pos, long len)
{
if(len == 0)
len = str.container.length() - pos;
return (php_var) str.container.substr(pos, len);
}
gcc error:
id31.cpp:592: error: ambiguous overload for ‘operator-’ in ‘_length - strlen(php_var)()’
id31.cpp:592: note: candidates are: operator-(const char*, const char*) <built-in>
id31.cpp:592: note: operator-(const char*, int) <built-in>
id31.cpp:592: note: operator-(const char*, int) <built-in>
id31.cpp:592: note: operator-(const char*, int) <built-in>
id31.cpp:592: note: operator-(int, int) <built-in>
id31.cpp:592: note: operator-(int, double) <built-in>
id31.cpp:592: note: operator-(int, float) <built-in>
id31.cpp:592: note: operator-(int, unsigned int) <built-in>
id31.cpp:592: note: operator-(int, long int) <built-in>
id31.cpp:592: note: operator-(double, int) <built-in>
id31.cpp:592: note: operator-(double, double) <built-in>
id31.cpp:592: note: operator-(double, float) <built-in>
id31.cpp:592: note: operator-(double, unsigned int) <built-in>
id31.cpp:592: note: operator-(double, long int) <built-in>
id31.cpp:592: note: operator-(float, int) <built-in>
id31.cpp:592: note: operator-(float, double) <built-in>
id31.cpp:592: note: operator-(float, float) <built-in>
id31.cpp:592: note: operator-(float, unsigned int) <built-in>
id31.cpp:592: note: operator-(float, long int) <built-in>
id31.cpp:592: note: operator-(unsigned int, int) <built-in>
id31.cpp:592: note: operator-(unsigned int, double) <built-in>
id31.cpp:592: note: operator-(unsigned int, float) <built-in>
id31.cpp:592: note: operator-(unsigned int, unsigned int) <built-in>
id31.cpp:592: note: operator-(unsigned int, long int) <built-in>
id31.cpp:592: note: operator-(long int, int) <built-in>
id31.cpp:592: note: operator-(long int, double) <built-in>
id31.cpp:592: note: operator-(long int, float) <built-in>
id31.cpp:592: note: operator-(long int, unsigned int) <built-in>
id31.cpp:592: note: operator-(long int, long int) <built-in>
relevant code:
php_var _recruit = _length - (php_var)strlen(_flag);
if (_recruit < (php_var)1)
{
return _flag;
_end_18:
return (php_var)sprintf((string)(const char*)(php_var)"%0" + (string)(const char*)_length + (string)(const char*)(php_var)"d", _flag);
}
gcc error:
id31.cpp:598: error: cannot convert ‘std::basic_string<char, std::char_traits<char>, std::allocator<char> >’ to ‘char*’ for argument ‘1’ to ‘int sprintf(char*, const char*, ...)’
relevant code:
if (_recruit < (php_var)1)
{
return _flag;
_end_18:
return (php_var)sprintf((string)(const char*)(php_var)"%0" + (string)(const char*)_length + (string)(const char*)(php_var)"d", _flag);
}
You're passing a
php_var
object as parameter for variadic functionphp_var array(int key = 0, ...)
. This is not allowed. Only POD objects can be passed as variadic parameters.and 3. There's no
operator-
defined between anint
(or the type of_length
, don't know what type it is) and aphp_var
.sprintf
takes, as first argument, achar*
, while you're passing astd::string
to it. Usestd::string::c_str()
to convert your string to aconst char*
POD => Plain old data : varargs have been created for the C language, they can only be used with superstructure that not contain constructor/destructor.
The first error is simple, you just can't pass objects of type php_var
as variadic parameters (parameters to functions which specific ...
are the parameters).
As for the other errors, hard to say without seeing the definition of php_var
itself.
What the heck are you intending when you write: (string)(const char*)(php_var)"%0"
?!
you take a string then cast it to some unknown type, then cast it back to a const char*
(which it was to begin with), then force it to be a std::string
(which can't be passed to printf
)... why?
The last two snippets look like you are trying to let a parameter specify the length attribute of a printf
, if you look at the man page for it, you'll see the proper way is to just do this: printf("%*d", width, num);
. Simply placing a *
where the "width" option is expected tells printf
to take it from another passed parameter.
Finally, all of that casting you are doing is a sign of really bad code, when you do things correctly, casting should be a very infrequent occurrence.
精彩评论