ситуация  такова :
есть класс:
class BaseSort  
{
public:
   BaseSort(unsigned char *pB,unsigned char *pE);
   unsigned char *pEnd;
   unsigned char *pBegin;
   unsigned char bs[MAX_SYMBOLS];
   BaseSort();
   unsigned char* operator[](long i);
   void operator=(unsigned char* c);
   virtual ~BaseSort();
};
где :
unsigned char* BaseSort::operator [](long i)
{
   return pBegin+i*MAX_SYMBOLS;
}
есть шаблон функции :
template<class T>
void quickSortR(T* a, long N) {
// На входе - массив a[], a[N] - его последний элемент.
  long i = 0, j = N;       // поставить указатели на исходные места
  T temp, p;
  p = a[ N>>1 ];      // центральный элемент
  // процедура разделения
  do {
    while ( a < p ) i++;
    while ( a[j] > p ) j--;
    if (i <= j) {
      temp = a; a = a[j]; a[j] = temp;
      i++; j--;
    }
  } while ( i<=j );
  // рекурсивные вызовы, если есть, что сортировать 
  if ( j > 0 ) quickSortR(a, j);
  if ( N > i ) quickSortR(a+i, N-i);
}
при вызове:
unsigned char pFile;
long   FileSize;
....
BaseSort tt(pFile,pFile+FileSize);
quickSortR(&tt,FileSize); 
 вместо моего operator[] " return (unsigned char*) pBegin+N/2*MAX_SYMBOLS " вызывается нечто вроде : " return (BaseSort&) &tt+i*sizeof(tt) "- я так думаю это operator[] по умолчанию  
 и как следсвие того, что op[] возврашщяет BaseSort& вызывается уже не operator=(unsigned char*) , а operator=(BaseSort&); 
 Как мне вставить свой operator[] в класс ? 
 Или придется переписывать все шаблоны ?