problemă linker

voturi
2

Am o problemă cu linker-ul atunci când am construi proiectul meu actual.

Eroarea este vorba cu este după cum urmează:

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&)'

Acest lucru este puțin ciudat, ca în măsura în care eu sunt conștient această metodă este declarat într-un fișier care este cu siguranță în curs de compilare:


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;
}

}

Stie cineva de ce această eroare ar putea apărea?

NB Acest lucru este compilat folosind MPICXX pe Fedora, și eu sunt, folosind CCMAKE.

Noroc, Ed

EDIT Ok, folosind nm am găsit următoarele:

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

atunci când dorește acest lucru în schimb:

std::basic_ostream >& SparseImplementationLib::operator<< <double, double, SparseImplementationLib::DefaultPtr<double, double> >(std::basic_ostream >&, SparseImplementationLib::AbstractSparseNode<double, double, SparseImplementationLib::DefaultPtr<double, double> > const&)
Din păcate, nu am nici o idee cum să se stabilească acest lucru, cuș operatorul << durează doar 2 argumente.

Oricine obține un indiciu?

(Random s \ înainte de toate _S este de a încerca să scape de ei, StackOverflow este puțin cam temperamental astăzi și nu o va face (altfel vom obține cursive minunat aleatoriu în codul meu))

Întrebat 12/03/2009 la 16:31
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
1

poate nm obiectul care este generat de codul prezentat mai sus, pentru a vedea că semnătura este într-adevăr ceea ce vă așteptați.

Publicat 12/03/2009 la 16:59
sursa de către utilizator

voturi
0

Încercarea de a analiza (reformatare), acea linie, așa că am pot citi ...

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

Dacă am citit acest drept, atunci:

  • clasa ActivityType este un dublu .
  • clasa WeightType este un dublu .
  • clasa ptr_type este un SparseImplementationLib :: DefaultPtr <dublu, dublu>

Și într -un fel de- al doilea argument
const AbstractSparseNode <ActivityType, WeightType> & , de
exemplu , Const AbstractSparseNode <dublu, dublu> &
a devenit:

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

Numărarea șablon de argument nu se potrivesc. Ați definit al doilea argument (templated) cu 2 parametri Templated și mesajul de eroare indică 3 parametri templated.

Publicat 12/03/2009 la 17:46
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more