2010-12-04 3 views
5

Я пытаюсь перегрузить оператор ostream, чтобы разрешить вывод для вложенного класса внутри шаблона. Однако компилятор не может привязать вызов фактической функции к моей перегрузке.Вывести вложенный класс внутри шаблона

template <class T> 
struct foo 
{ 
    struct bar { }; 
}; 

template <class T> 
std::ostream& operator << (std::ostream& os, 
    const typename foo<T>::bar& b) 
{ 
    return os; 
} 

int main() 
{ 
    foo<int>::bar b; 
    std::cout << b << std::endl; // fails to compile 
} 

будет скомпилирован, если я определяю перегрузку как встроенный friend функции:

template <class T> 
struct foo 
{ 
    struct bar 
    { 
     friend std::ostream& operator << (std::ostream& os, const bar& b) 
     { 
      return os; 
     } 
    }; 
}; 

Но я предпочел бы определить перегрузку вне класса. Это возможно?

+1

См. Http://stackoverflow.com/questions/4092237/c-nested-class-of-a-template-class – 2010-12-04 02:20:02

ответ

1

№ :-) Вы уже ответили на свой вопрос, но почему-то вам не нравится ответ? Johannes ссылки на сообщение, которое объясняет, что внутренний класс является «не выводимым контекстом». Если есть некоторые специализации шаблона foo, может быть несколько foos с одним и тем же классом внутренних баров. Затем компилятор не может определить, что такое foo :: bar, если только он не создавал foo для всех возможных Ts. В стандарте говорится, что он не должен этого делать.

Что случилось с вашим оригинальным решением с оператором? Вам не нужно определять его встроенным, вам просто нужно объявить его внутри локального класса.

Смежные вопросы