
sj@sjcomp.com:
Hello,
I'm upgrading from boost 1.33.1 to 1.34.1 and upgrade does not let me compile the following code:
// CRefCounted provides functionality to CRefPtr to have // referenced pointers struct CNode: public CRefCounted { void GetName(){} };
int main(int argc, char **argv){ typedef CRefPtr<CNode> CPNode; typedef std::multimap<std::string, CPNode> TPNodes; TPNodes Children; std::for_each( Children.begin(), Children.end(), boost::bind( &CNode::GetName, // problem in the next line boost::bind(&TPNodes::value_type::second,_1))); return 0; }
I get the following messages from MSVC8.0: error C2784: 'T *boost::get_pointer(const boost::shared_ptr<T> &)' : could not deduce template argument for 'const boost::shared_ptr<T> &' from 'const CPNode' error C2784: 'T *boost::get_pointer(const std::auto_ptr<_Ty> &)' : could not deduce template argument for 'const std::auto_ptr<_Ty> &' from 'const CPNode' error C2784: 'T *boost::get_pointer(T *)' : could not deduce template argument for 'T *' from 'const CPNode'
If I replace CRefPtr with boost::shared_ptr the code compiles. Hence I assume the problem is with the way I implemented CRefPtr class. Here it is: template<typename T> class CRefPtr {
... You need to implement get_pointer for CRefPtr. Add the following after CRefPtr's definition: template<class T> T* get_pointer( CRefPtr<T> const & p ) { return p.get(); } or use boost::intrusive_ptr.