Вывести вложенный класс внутри шаблона - PullRequest
5 голосов
/ 04 декабря 2010

Я пытаюсь перегрузить оператор 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 Ответ

1 голос
/ 19 февраля 2011

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

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

...