9
ottengo un errore del compilatore per questo codice:Template un argomento shared_ptr
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
struct Name
{
};
typedef boost::shared_ptr<Name> NamePtr;
struct Foo
{
NamePtr name;
};
typedef boost::shared_ptr<Foo> FooPtr;
template<class T>
void setName(T item, NamePtr name = boost::make_shared<Name>())
{
item->name = name;
}
int main()
{
FooPtr foo = boost::make_shared<Foo>();
setName(foo);
return 0;
}
come segue:
main.cpp: error C2780: 'boost::shared_ptr<X> boost::make_shared(A1 &&,A2 &&,A3 &&,A4 &&,A5 &&,A6 &&,A7 &&,A8 &&,A9 &&)' : expects 9 arguments - 0 provided
1> c:\users\ebargri\desktop\boost_1_49_0\boost\smart_ptr\make_shared.hpp(590) : see declaration of 'boost::make_shared'
1>main.cpp: error C2780: 'boost::shared_ptr<X> boost::make_shared(A1 &&,A2 &&,A3 &&,A4 &&,A5 &&,A6 &&,A7 &&,A8 &&)' : expects 8 arguments - 0 provided
1> c:\users\ebargri\desktop\boost_1_49_0\boost\smart_ptr\make_shared.hpp(534) : see declaration of 'boost::make_shared'
1>main.cpp: error C2780: 'boost::shared_ptr<X> boost::make_shared(A1 &&,A2 &&,A3 &&,A4 &&,A5 &&,A6 &&,A7 &&)' : expects 7 arguments - 0 provided
1> c:\users\ebargri\desktop\boost_1_49_0\boost\smart_ptr\make_shared.hpp(480) : see declaration of 'boost::make_shared'
1>main.cpp: error C2780: 'boost::shared_ptr<X> boost::make_shared(A1 &&,A2 &&,A3 &&,A4 &&,A5 &&,A6 &&)' : expects 6 arguments - 0 provided
1> c:\users\ebargri\desktop\boost_1_49_0\boost\smart_ptr\make_shared.hpp(428) : see declaration of 'boost::make_shared'
1>main.cpp: error C2780: 'boost::shared_ptr<X> boost::make_shared(A1 &&,A2 &&,A3 &&,A4 &&,A5 &&)' : expects 5 arguments - 0 provided
1> c:\users\ebargri\desktop\boost_1_49_0\boost\smart_ptr\make_shared.hpp(378) : see declaration of 'boost::make_shared'
1>main.cpp: error C2780: 'boost::shared_ptr<X> boost::make_shared(A1 &&,A2 &&,A3 &&,A4 &&)' : expects 4 arguments - 0 provided
1> c:\users\ebargri\desktop\boost_1_49_0\boost\smart_ptr\make_shared.hpp(330) : see declaration of 'boost::make_shared'
1>main.cpp: error C2780: 'boost::shared_ptr<X> boost::make_shared(A1 &&,A2 &&,A3 &&)' : expects 3 arguments - 0 provided
1> c:\users\ebargri\desktop\boost_1_49_0\boost\smart_ptr\make_shared.hpp(284) : see declaration of 'boost::make_shared'
1>main.cpp: error C2780: 'boost::shared_ptr<X> boost::make_shared(A1 &&,A2 &&)' : expects 2 arguments - 0 provided
1> c:\users\ebargri\desktop\boost_1_49_0\boost\smart_ptr\make_shared.hpp(240) : see declaration of 'boost::make_shared'
1>main.cpp: error C2780: 'boost::shared_ptr<X> boost::make_shared(A1 &&)' : expects 1 arguments - 0 provided
1> c:\users\ebargri\desktop\boost_1_49_0\boost\smart_ptr\make_shared.hpp(198) : see declaration of 'boost::make_shared'
1>main.cpp: error C2783: 'boost::shared_ptr<X> boost::make_shared(void)' : could not deduce template argument for 'T'
1> c:\users\ebargri\desktop\boost_1_49_0\boost\smart_ptr\make_shared.hpp(121) : see declaration of 'boost::make_shared'
Che cosa sto facendo di sbagliato?
Se si sostituisce la funzione di template con questo, il codice compila bene:
void setName(FooPtr item, NamePtr name = boost::make_shared<Name>())
{
item->name = name;
}
Sarà anche la compilazione se sostituisco con questo:
template<class T>
void setName(T item)
{
}
e sarà anche compilare se io passare il secondo argomento come segue:
FooPtr foo = boost::make_shared<Foo>();
NamePtr name = boost::make_shared<Name>();
setName(foo, name);
Questo non compila neanche:
setName<FooPtr>(foo);
UPDATE:
Ecco un altro esempio:
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
template<class T>
void f(T item, boost::shared_ptr<int> name = boost::make_shared<int>())
{
}
int main()
{
f(0);
}
la tua classe non dovrebbe avere un costruttore pubblico? – stijn
Le strutture @stijn sono classi con costruttori pubblici predefiniti – Baz
Lo so, ma l'incremento non sembra come costruire qui il nome? Oppure sto interpretando erroneamente i messaggi di errore. – stijn