链接器问题:未定义的引用

时间:2009-03-12 15:31:51

标签: c++ linker

构建当前项目时,链接器出现问题。

它出现的错误如下:

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

这有点奇怪,因为我知道这个方法是在一个肯定被编译的文件中声明的:


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

}

为什么会出现此错误?

N.B。这是在Fedora上使用MPICXX编译的,我正在使用CCMAKE。

编辑好了,使用nm我发现了以下内容:

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

当它想要这个时:

std::ostream& SparseImplementationLib::operator<< <double, double, SparseImplementationLib::DefaultPtr<double, double> >(std::ostream&, SparseImplementationLib::AbstractSparseNode<double, double, SparseImplementationLib::DefaultPtr<double, double> > const&)
不幸的是,我不知道如何解决这个问题,cus运算符&lt;&lt;只需要2个参数。

(所有_s之前的随机\ s是试图逃避它们,stackoverflow今天有点气质,不会这样做(否则我们会在代码中随机得到可爱的斜体))

2 个答案:

答案 0 :(得分:1)

你可以通过上面显示的代码生成对象,看看是吗? 签名确实是你所期望的。

答案 1 :(得分:0)

尝试解析(重新格式化)该行,以便我可以阅读...

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

如果我读得对,那么:

  • 类ActivityType double
  • class WeightType double
  • class ptr_type SparseImplementationLib :: DefaultPtr&lt; double,double&gt;

以某种方式第二个参数
const AbstractSparseNode&lt; ActivityType,WeightType&gt;&amp; ,例如 const AbstractSparseNode&lt; double,double&gt;&amp;
已成为:

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

模板参数计数不匹配。您已使用2个模板化参数定义了第二个(模板化)参数,并且您的错误消息指示了3个模板化参数。