Использование перегруженного оператора вывода для шаблонного класса: неопределенные символы для архитектуры x86_64

Я играю с шаблонным классом стека на основе массива и испытываю проблемы с перегрузкой оператора вывода. Для начала у меня есть что-то вроде этого:

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

person norman    schedule 07.01.2014    source источник