从'const char *'到'char *'的无效转换[-fpermissive]; VTK-7.1.1编译错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从'const char *'到'char *'的无效转换[-fpermissive]; VTK-7.1.1编译错误相关的知识,希望对你有一定的参考价值。

正如标题所说,我不是一个c ++程序员,我只是想编译这个,所以我可以为我想要的FreeCAD编译一些模块。我有VTK-8.90的问题我无法弄清楚所以我正在尝试这个版本,因为它是模块的推荐稳定版本。不是程序员,谷歌搜索这个错误一堆,我玩了很多与删除和添加/删除各种“const”和“char *”指示错​​误 - 但我真的不知道我在做什么所以我以为我会尝试得到一个具体的答案。 (我不认为编写的源代码必然是问题。)我正在编译使用它与python3.7,默认值是2.7,但这应该无关紧要因为这是c ++代码?

具体是这个错误:

[ 98%] Building CXX object Wrapping/PythonCore/CMakeFiles/vtkWrappingPythonCore.dir/vtkPythonArgs.cxx.o
/src/VTK-7.1.1/Wrapping/PythonCore/vtkPythonArgs.cxx: In instantiation of ‘bool vtkPythonGetStringValue(PyObject*, T*&, const char*) [with T = char; PyObject = _object]’:
/src/VTK-7.1.1/Wrapping/PythonCore/vtkPythonArgs.cxx:287:66:   required from here
/src/VTK-7.1.1/Wrapping/PythonCore/vtkPythonArgs.cxx:105:25: error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]
     a = PyUnicode_AsUTF8(o);
         ~~~~~~~~~~~~~~~~^~~
make[2]: *** [Wrapping/PythonCore/CMakeFiles/vtkWrappingPythonCore.dir/build.make:63: Wrapping/PythonCore/CMakeFiles/vtkWrappingPythonCore.dir/vtkPythonArgs.cxx.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:9917: Wrapping/PythonCore/CMakeFiles/vtkWrappingPythonCore.dir/all] Error 2
make: *** [Makefile:130: all] Error 2

这是vtkPythonArgs.cxx的第一个引用部分(从第93行开始):

template <class T> inline
bool vtkPythonGetStringValue(PyObject *o, T *&a, const char *exctext)

  if (PyBytes_Check(o))
  
    a = PyBytes_AS_STRING(o);
    return true;
  
#ifdef Py_USING_UNICODE
  else if (PyUnicode_Check(o))
  
#if PY_VERSION_HEX >= 0x03030000
    a = PyUnicode_AsUTF8(o);
    return true;
#else
    PyObject *s = _PyUnicode_AsDefaultEncodedString(o, NULL);
    if (s)
    
      a = PyBytes_AS_STRING(s);
      return true;
    

    exctext = "(unicode conversion error)";
#endif
  
#endif

  PyErr_SetString(PyExc_TypeError, exctext);
  return false;


inline bool vtkPythonGetStdStringValue(PyObject *o, std::string &a, const char *exctext)

  if (PyBytes_Check(o))
  
    char* val;
    Py_ssize_t len;
    PyBytes_AsStringAndSize(o, &val, &len);
    a = std::string(val, len);
    return true;
  
#ifdef Py_USING_UNICODE
  else if (PyUnicode_Check(o))
  
#if PY_VERSION_HEX >= 0x03030000
    Py_ssize_t len;
    const char* val = PyUnicode_AsUTF8AndSize(o, &len);
    a = std::string(val, len);
    return true;
#else
    PyObject *s = _PyUnicode_AsDefaultEncodedString(o, NULL);
    if (s)
    
      char* val;
      Py_ssize_t len;
      PyBytes_AsStringAndSize(s, &val, &len);
      a = std::string(val, len);
      return true;
    

    exctext = "(unicode conversion error)";
#endif
  
#endif

  PyErr_SetString(PyExc_TypeError, exctext);
  return false;

第287行(从281开始):

inline
bool vtkPythonGetValue(PyObject *o, char *&a)

  a = NULL;

  return (o == Py_None ||
          vtkPythonGetStringValue(o, a, "string or None required"));

该文件是1600行,我不确定整个事情是否会更有帮助。

谢谢。

答案

好吧,看起来功能PyUnicode_AsUTF8必须返回char const*。函数vtkPythonGetValue调用模板函数vtkPythonGetStringValuevtkPythonGetValue将参数a作为参数char,这是对非const vtkPythonGetStringValue的非const指针的左值引用,并将其传递给T,导致它被实例化为char推导为char const而不是vtkPythonGetValue。指向const对象的指针不能分配给指向非const的指针,只允许反向。所以函数char应该真正采用左值引用指向const inline bool vtkPythonGetValue(PyObject* o, char const*& a) a = NULL; return (o == Py_None || vtkPythonGetStringValue(o, a, "string or None required")); 的非const指针。像这样:

qazxswpoi

以上是关于从'const char *'到'char *'的无效转换[-fpermissive]; VTK-7.1.1编译错误的主要内容,如果未能解决你的问题,请参考以下文章

在Qt中如何将QString转换为const char*

cannot convert from 'const char [3]' to 'char'

cannot convert parameter 1 from 'const char [] ' to 'const wchar_t *

C++求助[Error]cannot convert 'const wchar_t*' to 'LPCSTR aka const char*

error C2664: 'strcpy' : cannot convert parameter 2 from 'LPCTSTR' to 'const char

error: no matching function for call to 'std::exception:exception(const char[16])'