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

invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]; VTK-7.1.1 compilation error

正如标题所说,我不是 C++ 程序员,我只是想编译它,这样我就可以为我想要的 FreeCAD 编译一些模块。我在使用 VTK-8.90 时遇到了问题,我无法弄清楚所以我正在尝试这个版本,因为它是模块推荐的稳定版本。不是程序员,也不是谷歌搜索这个错误,我玩了很多关于删除和 adding/removing 各种 "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 的非常量指针的左值引用,并将其传递给 vtkPythonGetStringValue,导致它被实例化为 T 推导为 char 而不是 char const。不能将指向 const 对象的指针分配给指向非 const 的指针,只允许相反的操作。所以函数 vtkPythonGetValue 应该是对指向 const char 的非常量指针的左值引用。像这样:

inline
bool vtkPythonGetValue(PyObject* o, char const*& a)
{
  a = NULL;
  return (o == Py_None ||
          vtkPythonGetStringValue(o, a, "string or None required"));
}