对模板化类使用重载输出运算符:体系结构x86_64的未定义符号

时间:2014-01-07 03:19:57

标签: c++ templates operator-overloading output undefined-symbol

我正在使用模板化的,基于数组的堆栈类,并且在重载输出运算符时遇到问题。首先,我有这样的事情:

template <typename Object>
class ArrayStack {
  public:

    ...

    friend ostream& operator<<(ostream& _os, ArrayStack& _as);

    ...

  private:
    ...
    Object*   S;   // the stack array
    int       t;   // index of the top of the stack
};

然后,作为同一文件(ArrayStack.h)中的自由函数,输出运算符实现如下:

template <typename Object>
ostream& 
operator<<(ostream& _os, ArrayStack<Object>& _as){

  for(int i = 0; i <= _as.t; i++){
    _os << (_as.S)[i] << '\n'; 
  }
  return _os;
} 

我尝试在单独的ASTest.cpp中使用此运算符:

#include "ArrayStack.h"
#include <iostream>

using namespace std;

int main(){

  ArrayStack<int> intStack(10);
  intStack.push(12);
  intStack.push(3);
  cout << "The stack: " << endl;
  cout << intStack;  //Error! 
}

编译失败,出现以下错误:

Undefined symbols for architecture x86_64:
  "operator<<(std::ostream&, ArrayStack<int>&)", referenced from:
      _main in ASPractice-rDD5cY.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

这里出了什么问题?我的猜测是有些东西正在寻找一个非常具体的<<运算符,它是针对整数的ArrayStacks而制作的......尽管事实如此,它对于任何旧的“对象”模板化的广泛运算符并不满意。这似乎应该适应整数和其他任何东西! (?)

我该如何解决这个问题?

如果它很重要,这是我的Mac OS X 10.8.5上g ++ -v的输出:

Configured with: --prefix=/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.0 (clang-500.2.75) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin12.5.0
Thread model: posix

0 个答案:

没有答案