【问题标题】:initialize a vector by a pointer of a CLASS通过 CLASS 的指针初始化向量
【发布时间】: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 文件和详细的

标签: c++ vector


【解决方案1】:

我找到了解决方案,我对 (UNITCallback*) 进行了强制转换,它就像一个魅力。 这是代码:

#include <iostream>
#include <vector>
#include <algorithm>
#include"vector.h"


struct UNITEvent_LoopImpl
    {
    UNITEvent_LoopImpl() :
        stopLoop(false),
        callBacks(1024,(UNITCallback*)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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多