从“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
调用模板函数 vtkPythonGetStringValue
。 vtkPythonGetValue
作为参数 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"));
}
正如标题所说,我不是 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
调用模板函数 vtkPythonGetStringValue
。 vtkPythonGetValue
作为参数 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"));
}