【发布时间】:2020-03-03 12:23:50
【问题描述】:
我正在尝试从编程书中执行有关“运算符重载”的代码示例。但是,我有以下错误:
invalid conversion from 'char' to 'void*' [-fpermissive]
char *p= new ('$') char[100];
这就是我重载 new 运算符的方式:
void *operator new(size_t sz,int setvalue)
{
void *p;
p=malloc(sz);
if(p==NULL){
memoryWarning();
}
memset(p,setvalue,sz);
return(p);
}
int main()
{
//rest of the code;
char *p = new ('$') char[100];
//rest of the code
}
构建期间的控制台输出:
21:39:21 **** Incremental Build of configuration Debug for project chapter5a ****
Info: Internal Builder is used for build
g++ -O0 -g3 -Wall -c -fmessage-length=0 -std=c99 -o "src\\chapter5a.o" "..\\src\\chapter5a.cpp"
cc1plus.exe: warning: command line option '-std=c99' is valid for C/ObjC but not for C++
<strong>..\src\chapter5a.cpp: In function 'int main()':
..\src\chapter5a.cpp:22:20: error: invalid conversion from 'char' to 'void*' [-fpermissive]
char *p= new('$') char;*
^~~~</strong>
In file included from C:/Program Files (x86)/mingw-w64/i686-6.4.0-posix-dwarf-rt_v5-rev0/mingw32/lib/gcc/i686-w64-mingw32/6.4.0/include/c++/ext/new_allocator.h:33:0,
from C:/Program Files (x86)/mingw-w64/i686-6.4.0-posix-dwarf-rt_v5-rev0/mingw32/lib/gcc/i686-w64-mingw32/6.4.0/include/c++/i686-w64-mingw32/bits/c++allocator.h:33,
from C:/Program Files (x86)/mingw-w64/i686-6.4.0-posix-dwarf-rt_v5-rev0/mingw32/lib/gcc/i686-w64-mingw32/6.4.0/include/c++/bits/allocator.h:46,
from C:/Program Files (x86)/mingw-w64/i686-6.4.0-posix-dwarf-rt_v5-rev0/mingw32/lib/gcc/i686-w64-mingw32/6.4.0/include/c++/string:41,
from C:/Program Files (x86)/mingw-w64/i686-6.4.0-posix-dwarf-rt_v5-rev0/mingw32/lib/gcc/i686-w64-mingw32/6.4.0/include/c++/bits/locale_classes.h:40,
from C:/Program Files (x86)/mingw-w64/i686-6.4.0-posix-dwarf-rt_v5-rev0/mingw32/lib/gcc/i686-w64-mingw32/6.4.0/include/c++/bits/ios_base.h:41,
from C:/Program Files (x86)/mingw-w64/i686-6.4.0-posix-dwarf-rt_v5-rev0/mingw32/lib/gcc/i686-w64-mingw32/6.4.0/include/c++/ios:42,
from C:/Program Files (x86)/mingw-w64/i686-6.4.0-posix-dwarf-rt_v5-rev0/mingw32/lib/gcc/i686-w64-mingw32/6.4.0/include/c++/ostream:38,
from C:/Program Files (x86)/mingw-w64/i686-6.4.0-posix-dwarf-rt_v5-rev0/mingw32/lib/gcc/i686-w64-mingw32/6.4.0/include/c++/iostream:39,
from ..\src\chapter5a.cpp:9:
C:/Program Files (x86)/mingw-w64/i686-6.4.0-posix-dwarf-rt_v5-rev0/mingw32/lib/gcc/i686-w64-mingw32/6.4.0/include/c++/new:146:14:<strong> note: initializing argument 2 of 'void* operator new(std::size_t, void*)'
inline void* operator new(std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT
^~~~~~~~</strong>
21:39:21 Build Finished (took 703ms)
【问题讨论】:
-
您的书似乎有缺陷。我推荐good C++ book。
main应该返回int,合并new和new[]。 -
在 Visual Studio 中它确实可以编译和工作。您可以尝试将线路更改为
char *p = (char*)(new ('$') char[100]);并查看它是否有效?你使用什么样的编译器? -
我正在使用 MinGW GCC
-
尝试将行更改为
char *p = (char*)(new ('$') char[100])它不起作用。同样的错误。 -
@Rixment 它似乎也适用于 Godbolt 上的 MSVC(即使是
/permissive-)。我不知道为什么 MSVC 认为它可以在这里调用operator new而不是operator new[]而无需诊断。我在标准中找不到任何支持它的东西。对我来说,这看起来像是一个非标准扩展或错误。
标签: c++ compiler-errors operator-overloading new-operator