0

I'm trying to add create a map with the string key and the abstract class value with this code

using Commands = = std::map<std::string, std::shared_ptr<spyCBlockRPC::IRPCCommand>>;

RPCCommandMediator {

public:
   Commands commands = {
            {"DECODE_SCRIPT_COMMAND", std::shared_ptr<IRPCCommand *>(new DecodeScriptCommand())},
      };

}

How the abstract class is written by this code

class IRPCCommand
  {
    public:

      virtual void doCommand(WrapperInformations &wrapper, BitcoinAPI &bitcoinApi) = 0;

  };

The concrete class is written by this code

class DecodeScriptCommand : public IRPCCommand
    {
        public:

          DecodeScriptCommand();

          void doCommand(WrapperInformations &wrapper, BitcoinAPI &bitcoinApi) override;
    };

and the file CPP is

DecodeScriptCommand::DecodeScriptCommand() : IRPCCommand(){}

void DecodeScriptCommand::doCommand(WrapperInformations &wrapper, BitcoinAPI &bitcoinApi)
{
  //Operations
}

When compiling it, I have this error

In file included from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:0:
/home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:80:93: error: no matching function for call to ‘std::shared_ptr<spyCBlockRPC::IRPCCommand*>::shared_ptr(spyCBlockRPC::DecodeScriptCommand*)’
             {DECODE_SCRIPT_COMMAND, std::shared_ptr<IRPCCommand *>(new DecodeScriptCommand())},
                                                                                             ^
In file included from /usr/include/c++/7/memory:81:0,
                 from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:6,
                 from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:
/usr/include/c++/7/bits/shared_ptr.h:352:7: note: candidate: std::shared_ptr<_Tp>::shared_ptr(const std::weak_ptr<_Tp>&, std::nothrow_t) [with _Tp = spyCBlockRPC::IRPCCommand*]
       shared_ptr(const weak_ptr<_Tp>& __r, std::nothrow_t)
       ^~~~~~~~~~
/usr/include/c++/7/bits/shared_ptr.h:352:7: note:   candidate expects 2 arguments, 1 provided
/usr/include/c++/7/bits/shared_ptr.h:342:2: note: candidate: template<class _Alloc, class ... _Args> std::shared_ptr<_Tp>::shared_ptr(std::_Sp_make_shared_tag, const _Alloc&, _Args&& ...)
  shared_ptr(_Sp_make_shared_tag __tag, const _Alloc& __a,
  ^~~~~~~~~~
/usr/include/c++/7/bits/shared_ptr.h:342:2: note:   template argument deduction/substitution failed:
In file included from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:0:
/home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:80:93: note:   candidate expects at least 2 arguments, 1 provided
             {DECODE_SCRIPT_COMMAND, std::shared_ptr<IRPCCommand *>(new DecodeScriptCommand())},
                                                                                             ^
In file included from /usr/include/c++/7/memory:81:0,
                 from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:6,
                 from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:
/usr/include/c++/7/bits/shared_ptr.h:294:17: note: candidate: constexpr std::shared_ptr<_Tp>::shared_ptr(std::nullptr_t) [with _Tp = spyCBlockRPC::IRPCCommand*; std::nullptr_t = std::nullptr_t]
       constexpr shared_ptr(nullptr_t) noexcept : shared_ptr() { }
                 ^~~~~~~~~~
/usr/include/c++/7/bits/shared_ptr.h:294:17: note:   no known conversion for argument 1 from ‘spyCBlockRPC::DecodeScriptCommand*’ to ‘std::nullptr_t’
/usr/include/c++/7/bits/shared_ptr.h:286:2: note: candidate: template<class _Yp, class _Del, std::shared_ptr<spyCBlockRPC::IRPCCommand*>::_Constructible<std::unique_ptr<_Tp, _Dp>, std::__sp_array_delete>* <anonymous> > std::shared_ptr<_Tp>::shared_ptr(std::unique_ptr<_Up, _Ep>&&)
  shared_ptr(unique_ptr<_Yp, _Del>&& __r)
  ^~~~~~~~~~
/usr/include/c++/7/bits/shared_ptr.h:286:2: note:   template argument deduction/substitution failed:
In file included from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:0:
/home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:80:93: note:   mismatched types ‘std::unique_ptr<_Tp, _Dp>’ and ‘spyCBlockRPC::DecodeScriptCommand*’
             {DECODE_SCRIPT_COMMAND, std::shared_ptr<IRPCCommand *>(new DecodeScriptCommand())},
                                                                                             ^
In file included from /usr/include/c++/7/memory:81:0,
                 from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:6,
                 from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:
/usr/include/c++/7/bits/shared_ptr.h:277:2: note: candidate: template<class _Yp, class _Del, class> std::shared_ptr<_Tp>::shared_ptr(std::unique_ptr<_Up, _Ep>&&)
  shared_ptr(unique_ptr<_Yp, _Del>&& __r)
  ^~~~~~~~~~
/usr/include/c++/7/bits/shared_ptr.h:277:2: note:   template argument deduction/substitution failed:
In file included from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:0:
/home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:80:93: note:   mismatched types ‘std::unique_ptr<_Tp, _Dp>’ and ‘spyCBlockRPC::DecodeScriptCommand*’
             {DECODE_SCRIPT_COMMAND, std::shared_ptr<IRPCCommand *>(new DecodeScriptCommand())},
                                                                                             ^
In file included from /usr/include/c++/7/memory:81:0,
                 from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:6,
                 from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:
/usr/include/c++/7/bits/shared_ptr.h:270:2: note: candidate: template<class _Yp, class> std::shared_ptr<_Tp>::shared_ptr(std::auto_ptr<_Up>&&)
  shared_ptr(auto_ptr<_Yp>&& __r);
  ^~~~~~~~~~
/usr/include/c++/7/bits/shared_ptr.h:270:2: note:   template argument deduction/substitution failed:
In file included from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:0:
/home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:80:93: note:   mismatched types ‘std::auto_ptr<_Up>’ and ‘spyCBlockRPC::DecodeScriptCommand*’
             {DECODE_SCRIPT_COMMAND, std::shared_ptr<IRPCCommand *>(new DecodeScriptCommand())},
                                                                                             ^
In file included from /usr/include/c++/7/memory:81:0,
                 from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:6,
                 from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:
/usr/include/c++/7/bits/shared_ptr.h:265:11: note: candidate: template<class _Yp, class> std::shared_ptr<_Tp>::shared_ptr(const std::weak_ptr<_Yp>&)
  explicit shared_ptr(const weak_ptr<_Yp>& __r)
           ^~~~~~~~~~
/usr/include/c++/7/bits/shared_ptr.h:265:11: note:   template argument deduction/substitution failed:
In file included from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:0:
/home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:80:93: note:   mismatched types ‘const std::weak_ptr<_Tp>’ and ‘spyCBlockRPC::DecodeScriptCommand*’
             {DECODE_SCRIPT_COMMAND, std::shared_ptr<IRPCCommand *>(new DecodeScriptCommand())},
                                                                                             ^
In file included from /usr/include/c++/7/memory:81:0,
                 from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:6,
                 from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:
/usr/include/c++/7/bits/shared_ptr.h:253:2: note: candidate: template<class _Yp, class> std::shared_ptr<_Tp>::shared_ptr(std::shared_ptr<_Yp>&&)
  shared_ptr(shared_ptr<_Yp>&& __r) noexcept
  ^~~~~~~~~~
/usr/include/c++/7/bits/shared_ptr.h:253:2: note:   template argument deduction/substitution failed:
In file included from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:0:
/home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:80:93: note:   mismatched types ‘std::shared_ptr<_Tp>’ and ‘spyCBlockRPC::DecodeScriptCommand*’
             {DECODE_SCRIPT_COMMAND, std::shared_ptr<IRPCCommand *>(new DecodeScriptCommand())},
                                                                                             ^
In file included from /usr/include/c++/7/memory:81:0,
                 from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:6,
                 from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:
/usr/include/c++/7/bits/shared_ptr.h:244:7: note: candidate: std::shared_ptr<_Tp>::shared_ptr(std::shared_ptr<_Tp>&&) [with _Tp = spyCBlockRPC::IRPCCommand*]
       shared_ptr(shared_ptr&& __r) noexcept
       ^~~~~~~~~~
/usr/include/c++/7/bits/shared_ptr.h:244:7: note:   no known conversion for argument 1 from ‘spyCBlockRPC::DecodeScriptCommand*’ to ‘std::shared_ptr<spyCBlockRPC::IRPCCommand*>&&’
/usr/include/c++/7/bits/shared_ptr.h:236:2: note: candidate: template<class _Yp, class> std::shared_ptr<_Tp>::shared_ptr(const std::shared_ptr<_Yp>&)
  shared_ptr(const shared_ptr<_Yp>& __r) noexcept
  ^~~~~~~~~~
/usr/include/c++/7/bits/shared_ptr.h:236:2: note:   template argument deduction/substitution failed:
In file included from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:0:
/home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:80:93: note:   mismatched types ‘const std::shared_ptr<_Tp>’ and ‘spyCBlockRPC::DecodeScriptCommand*’
             {DECODE_SCRIPT_COMMAND, std::shared_ptr<IRPCCommand *>(new DecodeScriptCommand())},
                                                                                             ^
In file included from /usr/include/c++/7/memory:81:0,
                 from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:6,
                 from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:
/usr/include/c++/7/bits/shared_ptr.h:224:2: note: candidate: template<class _Yp> std::shared_ptr<_Tp>::shared_ptr(const std::shared_ptr<_Yp>&, std::shared_ptr<_Tp>::element_type*)
  shared_ptr(const shared_ptr<_Yp>& __r, element_type* __p) noexcept
  ^~~~~~~~~~
/usr/include/c++/7/bits/shared_ptr.h:224:2: note:   template argument deduction/substitution failed:
In file included from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:0:
/home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:80:93: note:   mismatched types ‘const std::shared_ptr<_Tp>’ and ‘spyCBlockRPC::DecodeScriptCommand*’
             {DECODE_SCRIPT_COMMAND, std::shared_ptr<IRPCCommand *>(new DecodeScriptCommand())},
                                                                                             ^
In file included from /usr/include/c++/7/memory:81:0,
                 from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:6,
                 from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:
/usr/include/c++/7/bits/shared_ptr.h:202:2: note: candidate: template<class _Deleter, class _Alloc> std::shared_ptr<_Tp>::shared_ptr(std::nullptr_t, _Deleter, _Alloc)
  shared_ptr(nullptr_t __p, _Deleter __d, _Alloc __a)
  ^~~~~~~~~~
/usr/include/c++/7/bits/shared_ptr.h:202:2: note:   template argument deduction/substitution failed:
In file included from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:0:
/home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:80:93: note:   candidate expects 3 arguments, 1 provided
             {DECODE_SCRIPT_COMMAND, std::shared_ptr<IRPCCommand *>(new DecodeScriptCommand())},
                                                                                             ^
In file included from /usr/include/c++/7/memory:81:0,
                 from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:6,
                 from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:
/usr/include/c++/7/bits/shared_ptr.h:183:2: note: candidate: template<class _Yp, class _Deleter, class _Alloc, class> std::shared_ptr<_Tp>::shared_ptr(_Yp*, _Deleter, _Alloc)
  shared_ptr(_Yp* __p, _Deleter __d, _Alloc __a)
  ^~~~~~~~~~
/usr/include/c++/7/bits/shared_ptr.h:183:2: note:   template argument deduction/substitution failed:
In file included from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:0:
/home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:80:93: note:   candidate expects 3 arguments, 1 provided
             {DECODE_SCRIPT_COMMAND, std::shared_ptr<IRPCCommand *>(new DecodeScriptCommand())},
                                                                                             ^
In file included from /usr/include/c++/7/memory:81:0,
                 from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:6,
                 from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:
/usr/include/c++/7/bits/shared_ptr.h:163:2: note: candidate: template<class _Deleter> std::shared_ptr<_Tp>::shared_ptr(std::nullptr_t, _Deleter)
  shared_ptr(nullptr_t __p, _Deleter __d)
  ^~~~~~~~~~
/usr/include/c++/7/bits/shared_ptr.h:163:2: note:   template argument deduction/substitution failed:
In file included from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:0:
/home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:80:93: note:   candidate expects 2 arguments, 1 provided
             {DECODE_SCRIPT_COMMAND, std::shared_ptr<IRPCCommand *>(new DecodeScriptCommand())},
                                                                                             ^
In file included from /usr/include/c++/7/memory:81:0,
                 from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:6,
                 from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:
/usr/include/c++/7/bits/shared_ptr.h:146:2: note: candidate: template<class _Yp, class _Deleter, class> std::shared_ptr<_Tp>::shared_ptr(_Yp*, _Deleter)
  shared_ptr(_Yp* __p, _Deleter __d)
  ^~~~~~~~~~
/usr/include/c++/7/bits/shared_ptr.h:146:2: note:   template argument deduction/substitution failed:
In file included from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:0:
/home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:80:93: note:   candidate expects 2 arguments, 1 provided
             {DECODE_SCRIPT_COMMAND, std::shared_ptr<IRPCCommand *>(new DecodeScriptCommand())},
                                                                                             ^
In file included from /usr/include/c++/7/memory:81:0,
                 from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:6,
                 from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:
/usr/include/c++/7/bits/shared_ptr.h:129:2: note: candidate: template<class _Yp, class> std::shared_ptr<_Tp>::shared_ptr(_Yp*)
  shared_ptr(_Yp* __p) : __shared_ptr<_Tp>(__p) { }
  ^~~~~~~~~~
/usr/include/c++/7/bits/shared_ptr.h:129:2: note:   template argument deduction/substitution failed:
/usr/include/c++/7/bits/shared_ptr.h:119:7: note: candidate: std::shared_ptr<_Tp>::shared_ptr(const std::shared_ptr<_Tp>&) [with _Tp = spyCBlockRPC::IRPCCommand*]
       shared_ptr(const shared_ptr&) noexcept = default;
       ^~~~~~~~~~
/usr/include/c++/7/bits/shared_ptr.h:119:7: note:   no known conversion for argument 1 from ‘spyCBlockRPC::DecodeScriptCommand*’ to ‘const std::shared_ptr<spyCBlockRPC::IRPCCommand*>&’
/usr/include/c++/7/bits/shared_ptr.h:117:17: note: candidate: constexpr std::shared_ptr<_Tp>::shared_ptr() [with _Tp = spyCBlockRPC::IRPCCommand*]
       constexpr shared_ptr() noexcept : __shared_ptr<_Tp>() { }
                 ^~~~~~~~~~
/usr/include/c++/7/bits/shared_ptr.h:117:17: note:   candidate expects 0 arguments, 1 provided
In file included from /home/vincenzo/Github/SpyCBlockRPC/src/core/graph/TransactionGraph.cpp:4:0:
/home/vincenzo/Github/SpyCBlockRPC/src/core/graph/../../commands/RPCCommandMediator.h:81:7: error: could not convert ‘{{((spyCBlockRPC::RPCCommandMediator*)this)->spyCBlockRPC::RPCCommandMediator::DECODE_SCRIPT_COMMAND, <expression error>}}’ from ‘<brace-enclosed initializer list>’ to ‘Commands {aka std::map<std::__cxx11::basic_string<char>, std::shared_ptr<spyCBlockRPC::IRPCCommand> >}’
       };

Some information

I have read this and this but I don't fix my error (maybe I don't undestend it)

vincenzopalazzo
  • 1,487
  • 2
  • 7
  • 35

1 Answers1

1

It looks like you should not put IRPCCommand * inside the shared_ptr template argument, you only want to store IRPCCommand objects inside the shared_ptr.

Like this:

 {"DECODE_SCRIPT_COMMAND", std::shared_ptr<IRPCCommand>(new DecodeScriptCommand())},

Alternatively you could use make_shared:

 {"DECODE_SCRIPT_COMMAND", std::make_shared<IRPCCommand>(new DecodeScriptCommand())},
johnyka
  • 399
  • 3
  • 15