Я играю с шаблонным классом стека на основе массива и испытываю проблемы с перегрузкой оператора вывода. Для начала у меня есть что-то вроде этого:
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 целых чисел... и его не устраивает широкий, созданный по шаблону для любого старого "Объекта", несмотря на то, что это, казалось бы, должно разместить целые числа и почти все остальное! (?)
Как это исправить?
Если это важно, вот вывод g++ -v на моем Mac OS X 10.8.5:
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