【发布时间】:2021-12-08 01:29:30
【问题描述】:
我正在尝试初始化 UNITCallback 类的指针向量。 这是代码: 文件矢量.h
#include <memory>
#include <unistd.h>
class UNITEvent_Loop;
class UNITCallback
{
public:
UNITCallback();
virtual ~UNITCallback();
virtual const fd_set & FdSet() = 0;
virtual void operator()(const fd_set & fds) = 0;
virtual void operator()() = 0;
virtual void eventLoop(UNITEvent_Loop * ev);
virtual UNITEvent_Loop * eventLoop();
private:
UNITEvent_Loop * evt_loop_;
};
class UNITEvent_Loop
{
public:
enum priority { LOW , HIGH};
UNITEvent_Loop();
~UNITEvent_Loop();
void stopLoop();
void runLoop();
void runLoop(int timeout); // in milliseconds
void runLoop(struct timeval * TO);
private:
UNITEvent_Loop & operator =(const UNITEvent_Loop &);
UNITEvent_Loop(const UNITEvent_Loop &);
std::auto_ptr<struct CMSPEvent_LoopImpl> impl_;
};
文件向量.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include"vector.h"
struct UNITEvent_LoopImpl
{
UNITEvent_LoopImpl() :
stopLoop(false),
callBacks(1024,0),//(FD_SETSIZE, 0),
priorities(FD_SETSIZE, UNITEvent_Loop::LOW) {};
//CMSPMutex protect;
bool stopLoop;
std::vector<UNITCallback * > callBacks;
std::vector<UNITEvent_Loop::priority> priorities;
};
int main() {
return 0;
}
所以当我编译时我收到:
/usr/include/c++/8/bits/stl_vector.h: In instantiation of ‘void
std::vector<_Tp, _Alloc>::_M_initialize_dispatch(_Integer, _Integer,
std::__true_type) [with _Integer = int; _Tp = UNITCallback*; _Alloc =
std::allocator<UNITCallback*>]’:
/usr/include/c++/8/bits/stl_vector.h:555:4: required from
‘std::vector<_Tp, _Alloc>::vector(_InputIterator, _InputIterator,
const allocator_type&) [with _InputIterator = int; _Tp =
UNITCallback*; _Alloc = std::allocator<UNITCallback*>;
std::vector<_Tp, _Alloc>::allocator_type =
std::allocator<UNITCallback*>]’
/vector/src/vector.cpp:20:48: required
from here /usr/include/c++/8/bits/stl_vector.h:1426:52: error: invalid
conversion from ‘int’ to ‘std::vector<UNITCallback*>::value_type’ {aka
‘UNITCallback*’} [-fpermissive]
_M_fill_initialize(static_cast<size_type>(__n), __value);
^~~~~~~
看起来我无法很好地初始化。为什么? 编辑: 我将添加cmake文件
cmake_minimum_required(VERSION 3.11.4)
cmake_policy (VERSION 3.11.4)
project (MSG_IMPF CXX C Fortran)
set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD 98)
SET(GCC_COVERAGE_COMPILE_FLAGS "-g -fpic -shared")
#at moment missing -lnsl -lsocket
SET(GCC_COVERAGE_LINK_FLAGS "-lrt -lpthread")
#Appending to corresponding CMake variables:
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}")
add_definitions(-D_POSIX_PTHREAD_SEMANTICS -D_POSIX_C_SOURCE=199506L -D__EXTENSIONS__ -DIT_USE_STD_IOSTREAM)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_SKIP_RPATH ON)
get_filename_component(LOCATION ${CMAKE_SOURCE_DIR} PATH)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LOCATION}/lib64)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LOCATION}/lib64)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LOCATION}/bin)
include_directories(
${LOCATION}/src
)
add_executable(test1
vector.cpp
)
所以详细的是: /usr/bin/c++ -DIT_USE_STD_IOSTREAM -D_POSIX_C_SOURCE=199506L -D_POSIX_PTHREAD_SEMANTICS -D__EXTENSIONS__ -I/vector/src -g -fpic -shared -std=gnu++98 -o CMakeFiles/test1.dir/vector.cpp.o -c /vector/src/vector.cpp
【问题讨论】:
-
0是一个int,你需要一个像nullptr这样的指针。至少这是你的错误信息所说的。我无法重现它,唯一的警告是已弃用的auto_ptr: godbolt.org/z/E1W9T65fE 我在 C++03 中遇到了同样的错误,然后0==>NULL修复了它 godbolt.org/z/KcM11jdTd -
奇怪。我正在使用 g++ (GCC) 8.3.1 20191121 (Red Hat 8.3.1-5)。所以我应该使用 nullptr?
-
我试过了。我得到了同样的错误。您使用的是哪个编译器?我正在使用标准 C99
-
@Apollo17 请发布您传递给 gcc 的确切命令行。特别是您正在使用的 C++ 标准。
-
我做到了。添加了 Cmakelists.txt 文件和详细的