2011-01-13 12 views
7

Si cambio de boost :: shared_ptr a std :: shared_ptr en este fragmento de código, obtendré el error del enlazador.Cómo resolver un conflicto entre boost :: shared_ptr y using std :: shared_ptr?

#include <iostream> 
#include <sstream> 
#include <iterator> 
#include <cctype> 
#include <cmath> 

#include <string> 
#include <vector> 
#include <stack> 
#include <queue> 
#include <set> 
#include <map> 

#include <functional> 
#include <utility> 
#include <numeric> 

#include <boost/assign.hpp> 
#include <boost/assign/std/vector.hpp> 

#include <boost/algorithm/string.hpp> 

#include <boost/test/included/unit_test.hpp> 
#include <boost/test/included/unit_test_framework.hpp> 
#include <boost/bind.hpp> 

//using namespace std; 
//using namespace boost; 

using std::string; 
using std::ostringstream; 
using namespace boost::assign; 
using namespace boost::unit_test; 

template<typename T> string to_string(T data) { ostringstream ost; ost << data; return ost.str(); } 

class TwoStringMasks { 
public: 
    string shortestCommon(string s1, string s2) { 
     //if(s1.find("*") != 0 || 
     return ""; 
    } 
}; 

class two_string_masks_test { 
public: 
    void test_case_one() { 
     string str = "TOPCODER*"; 
     BOOST_CHECK_EQUAL(str.find("*"), str.length() - 2); 
    } 
}; 

test_suite* init_unit_test_suite(int argc, char* argv[]) { 
    boost::shared_ptr<two_string_masks_test> tester(new two_string_masks_test); 
    framework::master_test_suite().add( 
     BOOST_TEST_CASE(boost::bind(&two_string_masks_test::test_case_one, tester))); 
    return 0; 
} 

error:

Error 12 error C2784: 'T *boost::get_pointer(T *)' : could not deduce template argument for 'T *' from 'std::tr1::shared_ptr<_Ty>' c:\program files\boost\boost_1_44\boost\bind\mem_fn_template.hpp 40 1 NET Report 
Error 10 error C2784: 'T *boost::get_pointer(const std::auto_ptr<_Ty> &)' : could not deduce template argument for 'const std::auto_ptr<_Ty> &' from 'std::tr1::shared_ptr<_Ty>' c:\program files\boost\boost_1_44\boost\bind\mem_fn_template.hpp 40 1 NET Report 
Error 11 error C2784: 'T *boost::get_pointer(const std::auto_ptr<_Ty> &)' : could not deduce template argument for 'const std::auto_ptr<_Ty> &' from 'std::tr1::shared_ptr<_Ty>' c:\program files\boost\boost_1_44\boost\bind\mem_fn_template.hpp 40 1 NET Report 
Error 8 error C2784: 'T *boost::get_pointer(const boost::shared_ptr<X> &)' : could not deduce template argument for 'const boost::shared_ptr<X> &' from 'std::tr1::shared_ptr<_Ty>' c:\program files\boost\boost_1_44\boost\bind\mem_fn_template.hpp 40 1 NET Report 
Error 9 error C2784: 'T *boost::get_pointer(const boost::shared_ptr<X> &)' : could not deduce template argument for 'const boost::shared_ptr<X> &' from 'std::tr1::shared_ptr<_Ty>' c:\program files\boost\boost_1_44\boost\bind\mem_fn_template.hpp 40 1 NET Report 
Error 6 error C2784: 'T *boost::get_pointer(const boost::scoped_ptr<T> &)' : could not deduce template argument for 'const boost::scoped_ptr<T> &' from 'std::tr1::shared_ptr<_Ty>' c:\program files\boost\boost_1_44\boost\bind\mem_fn_template.hpp 40 1 NET Report 
Error 7 error C2784: 'T *boost::get_pointer(const boost::scoped_ptr<T> &)' : could not deduce template argument for 'const boost::scoped_ptr<T> &' from 'std::tr1::shared_ptr<_Ty>' c:\program files\boost\boost_1_44\boost\bind\mem_fn_template.hpp 40 1 NET Report 
Error 13 error C2784: 'T *boost::get_pointer(const boost::reference_wrapper<T> &)' : could not deduce template argument for 'const boost::reference_wrapper<T> &' from 'std::tr1::shared_ptr<_Ty>' c:\program files\boost\boost_1_44\boost\bind\mem_fn_template.hpp 40 1 NET Report 
Error 14 error C2784: 'T *boost::get_pointer(const boost::reference_wrapper<T> &)' : could not deduce template argument for 'const boost::reference_wrapper<T> &' from 'std::tr1::shared_ptr<_Ty>' c:\program files\boost\boost_1_44\boost\bind\mem_fn_template.hpp 40 1 NET Report 
Error 2 error C2784: 'optional<T>::pointer_type boost::get_pointer(boost::optional<T> &)' : could not deduce template argument for 'boost::optional<T> &' from 'std::tr1::shared_ptr<_Ty>' c:\program files\boost\boost_1_44\boost\bind\mem_fn_template.hpp 40 1 NET Report 
Error 3 error C2784: 'optional<T>::pointer_type boost::get_pointer(boost::optional<T> &)' : could not deduce template argument for 'boost::optional<T> &' from 'std::tr1::shared_ptr<_Ty>' c:\program files\boost\boost_1_44\boost\bind\mem_fn_template.hpp 40 1 NET Report 
Error 4 error C2784: 'optional<T>::pointer_const_type boost::get_pointer(const boost::optional<T> &)' : could not deduce template argument for 'const boost::optional<T> &' from 'std::tr1::shared_ptr<_Ty>' c:\program files\boost\boost_1_44\boost\bind\mem_fn_template.hpp 40 1 NET Report 
Error 5 error C2784: 'optional<T>::pointer_const_type boost::get_pointer(const boost::optional<T> &)' : could not deduce template argument for 'const boost::optional<T> &' from 'std::tr1::shared_ptr<_Ty>' c:\program files\boost\boost_1_44\boost\bind\mem_fn_template.hpp 40 1 NET Report 

¿Qué hice mal? Supuse que había un conflicto entre el espacio de nombres std y el espacio de nombres boost, pero no sé cómo solucionarlo. ¿Alguna idea?

Gracias,
Chan

+2

Esos no son errores del enlazador, sino más bien errores del compilador. –

Respuesta

13

Parece que necesita agregar una sobrecarga de get_pointer para usar std::shared_ptr con boost :: bind.

namespace boost { 
    template<class T> const T* get_pointer(const std::shared_ptr<T>& ptr) 
    { 
    return ptr.get(); 
    } 

    template<class T> T* get_pointer(std::shared_ptr<T>& ptr) 
    { 
    return ptr.get(); 
    } 
} 

Me asumir que esto ya está funcionando si se utiliza std::bind lugar. O use tester.get() en el bind.

+0

wow, gracias por su elegante solución. ¿Es std :: bind lo mismo que boost :: bind? – Chan

+0

No, no es lo mismo, aunque la interfaz y la implementación pueden ser idénticas. Sin embargo, 'std :: bind' se deriva conceptualmente de la versión boost. Simplemente podría haber cambiado un poco en el proceso de estandarización. – ltjax

6

Boost y TR1 compartieron punteros son implementaciones independientes y no son compatibles - escoger uno o el otro y utilizarlo exclusivamente.

+0

gracias, ¿podría mostrarme cómo? Quiero usar std :: shared_ptr en este caso, pero no pude. – Chan

+0

Primero, probablemente debas aclarar dónde estás usando std :: tr1 :: shared_ptr - no aparece nada para mí, pero como no estoy seguro de qué columna de ese mensaje de error se supone que es el número de línea, es difícil para que coincida con los errores – bdonlan

+0

Dijo que si se convierte de impulso a tr1 por lo que presumiblemente el que está dentro del enlace. Pero como comenté, debe usar tr1 :: bind también. Mi propia experiencia es que impulsar está mucho mejor escrito que tr1, así que quédate con eso. – CashCow

3

boost :: bind no sabe qué hacer con tr1 :: shared_ptr sabe cómo manejar boost :: shared_ptr.

Puede probar tr1 :: bind que probablemente funciona con tr1 :: shared_ptr.

El único problema es si funcionará en BOOST_TEST_CASE. Si solo espera un "ejecutable", entonces una función tr1 :: es tan "ejecutable" como una de impulso.

+0

lo tengo solucionado! Muchas gracias. ¿Son tr1 :: bind & boost :: bind lo mismo? (solo espacio de nombres diferente)? – Chan

+0

No, no son lo mismo, pero ambos producen lo que se denomina "ejecutable", que es el término para algo que puede actuar como una función, y en esta ocasión BOOST_TEST_CASE no se preocupa por la implementación o la fuente que produjo el ejecutable (es decir, no tiene que venir de boost). – CashCow

1

¿Ha notado que no incluye explícitamente el encabezado de memoria> < (ni < boost/shared_ptr.hpp> para el caso)?

Si proporcionó más información, sería más fácil ayudar.

  1. ¿Qué compilador está utilizando?
  2. ¿Está esperando usar tr1 de su compilador de boost?
  3. ¿Desea acceder a shared_ptr como std :: tr1 :: shared_ptr o simplemente std :: shared_ptr?
+0

gracias por su preocupación. Compilador: VC++ 2010, quiero std :: shared_ptr ya que es C++ 0x std, no std :: tr1 :: shared_ptr. – Chan

Cuestiones relacionadas