2011-02-07 1 views
0

g ++이 내보내는 오류/경고는 각각 관련 코드입니다. 이러한 오류를 해결하거나 이에 대한 의견을 밝히는 데 도움이 될 경우 큰 도움이됩니다. 고맙습니다!이러한 6 g ++ 오류를 극복하려고 시도합니다.

g ++ 오류 :

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 

관련 코드 :

#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); 
    return arr; 
} 

GCC 오류 :

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> 

관련 코드 :

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 오류 :

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> 

관련 코드 :

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 오류 :

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*, ...)’ 

관련 코드 :

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); 

} 
+2

별도의 질문으로 나누시겠습니까? 많은 이슈들은 서로 관련이 없어 보입니다. –

+1

답변에 전혀 영향을 미치지 않지만 밑줄로 시작하는 이름은 예약되어 있으므로 코드에서 사용하면 안됩니다. –

+0

@Evan : 이것은 거짓이며'_ [A-Z]'로 시작하거나'_ (이중 밑줄)을 포함하는 이름은 예약되어 있고 나머지는 괜찮습니다. –

답변

4
  1. 가변 함수 php_var array(int key = 0, ...)에 대한 매개 변수로 php_var 개체를 전달 중입니다. 허용되지 않습니다. POD 객체 만 가변 인자로 전달할 수 있습니다.

  2. 와 3은 int 사이에 정의 된 operator- (또는 _length의 종류, 그것이 무엇인지 방식을 모르는)과 php_var을 없다.

  3. sprintfstd::string을 전달하는 동안 첫 번째 인수로 char*을 사용합니다. 첫 번째 오류는 간단 수있는 const char*

2

에 문자열을 변환하는 std::string::c_str()를 사용하여, 당신은 단지 (특정 ...이 매개 변수입니다 함수에 매개 변수) 유형 php_var와 같은 가변 인자 매개 변수의 객체를 전달할 수 없습니다.

다른 오류는 php_var 자체의 정의를 보지 않고 말하기 어렵습니다.

글을 쓸 때 무슨 의도인가요? : (string)(const char*)(php_var)"%0"?!

당신이 다음 문자열을 알 수없는 유형으로 캐스팅 한 후 다음 (가로 시작이었다)을 const char*에 그것을 다시 캐스트로 강제 printf에 전달 될 수 없습니다 std::string () ... 왜?당신은 당신이 그것에 대한 man 페이지를 보면 매개 변수가하는 printf의 길이 속성을 지정할 수 있도록 노력하고있다처럼 보일

마지막 두 조각, 당신은 적절한 방법 이렇게 만하는 것입니다 볼 수 있습니다 : printf("%*d", width, num);. *을 단순히 "width"옵션이 필요한 위치에 놓으면 printf에 전달 된 다른 매개 변수에서 가져 오게됩니다.

마지막으로 수행중인 모든 캐스팅 작업은 실제로 코드가 잘못되었음을 나타냅니다. 올바르게 수행하면 캐스팅 작업이 매우 드문 경우입니다.

+0

나도 알아, 나도 이걸 시도하려고해도 나 자신을 부끄러워해야하지만 그럼에도 불구하고 이것은 sourceforge에있는 binaryPHP라는 PHP에서 C++ 변환기로 생성 된 .cpp이다. 나는 PHP 프로그래머이므로 C++을 배우면서 정리하려고합니다. 어쩌면 나는이 코드로 머리를 쓰고 잘못 변환 된 것처럼 보인다. – cube

2

POD =>Plain old data : C 언어에 대한 varargs가 생성되었으므로 생성자/소멸자가 포함되지 않은 상부 구조물에만 사용할 수 있습니다.