a) non capisco perché definirlo due volte, non stai prima a scrivere direttamente:

contenitore<k>::nodo* contenitore<k>:perator[](int i) {........}

invece di definirlo anche come nodo* operator[](int) nell'header?

b) controlla che la chiamata sia effettuata su un oggetto o su una reference a contenitore<type>: se la fai su un puntatore viene chiamato l'operatore standard per i puntatori