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