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)

6
  • Could you provide the full error message? Commented Oct 14, 2019 at 16:59
  • @florgeng done, thanks Commented Oct 14, 2019 at 17:07
  • it has something to do with the map initialization. commands["xc"]= std::shared_ptr<IRPCCommand>(new DecodeScriptCommand()); works Commented Oct 14, 2019 at 18:07
  • Ok, work, but the semantics of initialization with {} is different? Commented Oct 14, 2019 at 18:23
  • 1
    @vincenzopalazzo std::shared_ptr<IRPCCommand *> is a different type than std::shared_ptr<IRPCCommand>. Don't include the * in the template parameter Commented Oct 14, 2019 at 18:35

1 Answer 1

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())}, 
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.