Aquí podría ser tu PUBLICIDAD


Problema del enlazador

votos
2

Tengo un problema con el enlazador cuando construyo mi proyecto actual.

El error que se presenta es el siguiente:

libmiinddynamic.so: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& SparseImplementationLib::operator<< <double, double, SparseImplementationLib::DefaultPtr<double, double> >(std::basic_ostream<char, std::char_traits<char> >&, SparseImplementationLib::AbstractSparseNode<double, double, SparseImplementationLib::DefaultPtr<double, double> > const&)'

Esto es un poco extraño, ya que, por lo que sé, este método se declara en un archivo que definitivamente se está compilando:


namespace SparseImplementationLib {
        template <ActivityType,WeightType,ptr_type = 
DefaultPtr<ActivityType,WeightType> > class AbstractSparseNode;
    // A whole bunch of other methods

//! All derived classes from AbstractSparseNode can use operator<<
template <class ActivityType, class WeightType, class ptr_type>
ostream& operator<<
(
    ostream& s, 
    const AbstractSparseNode<ActivityType,WeightType>& node)
{
    node.ToStream(s);
    return s;
}

}

¿Alguien sabe por qué podría aparecer este error?

NB Esto se compila usando MPICXX en Fedora, y estoy usando CCMAKE.

Saludos, Ed

EDITAR Ok, usando nm He encontrado lo siguiente:

std::ostream& SparseImplementationLib::operator<< <double, double, SparseImplementationLib::DefaultPtr<double, double> >(std::ostream&, SparseImplementationLib::AbstractSparseNode<double, double, SparseImplementationLib::DefaultPtr<double, double> > const&)

cuando quiere esto en su lugar:

std::basic_ostream >& SparseImplementationLib::operator<< <double, double, SparseImplementationLib::DefaultPtr<double, double> >(std::basic_ostream >&, SparseImplementationLib::AbstractSparseNode<double, double, SparseImplementationLib::DefaultPtr<double, double> > const&)
Lamentablemente, no tengo idea de cómo solucionar esto, cus operator << solo toma 2 argumentos.

Alguien tiene una pista?

(Lo aleatorio antes de todos los _s es intentar escapar de ellos, stackoverflow está siendo un poco temperamental hoy y no lo hará (de lo contrario, obtendremos cursivas encantadoras al azar en mi código))

Publicado el 12/03/2009 a las 16:31
fuente por usuario Ed James
En otros idiomas...        العربية       

2 respuestas

votos
1

¿Puedes medir el objeto generado por el código que se muestra arriba, para ver que la firma es de hecho lo que esperas?

Respondida el 12/03/2009 a las 04:59
fuente por usuario vrdhn


Aquí podría ser tu PUBLICIDAD


votos
0

Tratando de analizar (reformatear) esa línea para poder leerla ...

libmiinddynamic.so: undefined reference to:
ostream & SparseImplementationLib::operator<<
   < double, double, SparseImplementationLib::DefaultPtr<double, double> >
(
   ostream &,
  SparseImplementationLib::AbstractSparseNode<
     double, double, SparseImplementationLib::DefaultPtr<double, double> > const
)

Si leo ese derecho, entonces:

  • clase ActivityType es un doble .
  • clase WeightType es un doble .
  • clase ptr_type es una SparseImplementationLib :: DefaultPtr <double, double>

Y de alguna manera, el segundo argumento
consiste en AbstractSparseNode <ActivityType, WeightType> & ,
por ejemplo , const AbstractSparseNode <double, double> & se
ha convertido en un:

  SparseImplementationLib::AbstractSparseNode<
     double,
     double,
     SparseImplementationLib::DefaultPtr<double, double>
       > const &

Los recuentos de argumentos de la plantilla no coinciden. Ha definido el segundo argumento (plantilla) con 2 parámetros de plantilla y su mensaje de error indica 3 parámetros de plantilla.

Respondida el 12/03/2009 a las 05:46
fuente por usuario Mr.Ree