尝试编译搅拌库:错误:从'const char *'到'char *'的无效转换

时间:2010-12-01 14:16:15

标签: c++ const

首先,我对C ++和C很陌生,所以对我来说很容易:-) 其次,我知道这个问题以前曾以多种形式被多次提出,但我可以想到 如何弯曲我案例的答案...

我正在尝试从STIL库中编译一个名为utilities.cxx的文件,该文件具有某种“开源”许可证(不是真正的LGPL,所以我不知道我是否可以把它放在这里的重要部分。 ..

代码中包含以下功能:

char *replace_extension(char *file_in_directory_name, 
            const char * const extension)
{
char * location_of_dot = 
strchr(find_filename(file_in_directory_name),'.');
// first truncate at extension
if (location_of_dot!= NULL)
*(location_of_dot) = '\0';

strcat (file_in_directory_name,extension);
return file_in_directory_name;
}

编译它会出错:

g++  -O3  -ffast-math -DNDEBUG  -Wall -Wno-deprecated -I../lmf_v2.0
/includes -D_FILE_OFFSET_BITS=64  -I./include  -DSTIR_SIMPLE_BITMAPS -DSC_XWINDOWS 
-o  opt/buildblock/utilities.o -MMD -MP -c buildblock/utilities.cxx 
buildblock/utilities.cxx: In function ‘char* stir::replace_extension(char*, const 
char*)’:
buildblock/utilities.cxx:225: error: invalid conversion from ‘const char*’ to ‘char*’
make: *** [opt/buildblock/utilities.o] Error 1

任何帮助将不胜感激...谢谢,

盎司

好的,第一部分已经回答了......这是导致第二个错误的函数:

const char * const 
find_filename(const char * const filename_with_directory)
{
const char * name;

#if defined(__OS_VAX__)
name = strrchr(filename_with_directory,']');
if (name==NULL)
name = strrchr(filename_with_directory,':');
#elif defined(__OS_WIN__)
name = strrchr(filename_with_directory,'\\');
if (name==NULL)
name = strrchr(filename_with_directory,'/');
if (name==NULL)
name = strrchr(filename_with_directory,':');
#elif defined(__OS_MAC__)
name = strrchr(filename_with_directory,':');
#else // defined(__OS_UNIX__)
name = strrchr(filename_with_directory,'/');
#endif 
if (name!=NULL)
// KT 10/01/2000 name++ changed to name+1
return name+1;
else
return filename_with_directory;
}

2 个答案:

答案 0 :(得分:5)

此行导致错误:

char * location_of_dot = 
    strchr(find_filename(file_in_directory_name),'.');

strchr()在使用const char*作为第一个参数调用时返回char*而不是const char*(我假设find_filename()返回const char * 1}},否则你不会看到这个错误。)

由于您要分配strchr返回的内存位置,因此您不希望使用此重载版本。更改find_filename()以返回char*

更新:您已经发布了find_filename()的代码,更改返回类型将涉及更改其他内容(除此之外没有多大意义)。相反,将find_filename()的返回值转换为char*或将strchr()的结果转换为char*

示例(使用const cast):

char * location_of_dot = const_cast<char*>(
    strchr(find_filename(file_in_directory_name),'.'));

答案 1 :(得分:0)

添加以下重载:

char* find_filename( char* filename_with_directory)
{
    char const* const fname = filename_with_directory;
    return const_cast<char*>( find_filename( fname ) );
}

免责声明:编码器手中未触及的代码

欢呼&amp;第h。,