Обходной путь для вычета аргумента шаблона в контексте без направления

StackOverflow https://stackoverflow.com/questions/8308213

Вопрос

Рассмотрим следующий код:

#include <iostream>

template<class T>
struct outer {
    struct inner {};
};

template<class T>
std::ostream& operator<<(std::ostream & stream, 
                         typename outer<T>::inner const& value) {
    std::cout << "An outer::inner!";
    return stream;
}

int main() {
    outer<float>::inner foo;

    std::cout << foo << std::endl; // does not compile
}

Это не компилируется, потому что typename outer<T>::inner это неоснованный контекст (как объяснено здесь), то есть тип шаблона-аргументации не может быть выведен компилятором (чтение этот ответ за почему). Как я вижу, у меня есть два варианта, чтобы заставить его работать:

  1. Шаг inner снаружи outer И сделать это классовым-теплу. Я предпочитаю это, потому что влияние на использование кода меньше.
  2. Добавить to_string-Мете к внутреннему.

Есть ли какие -либо другие решения для этого (которые не приводят к уродливому синтаксису в коде использования)?

Это было полезно?

Решение

Вы можете переместить оператора в корпус внутреннего класса и положить friend перед этим. Затем замените тип параметра на просто inner.

Другой метод состоит в том, чтобы получить внутреннее из базы CRTP, параметризованного Inner. Затем сделайте параметр введите класс CRTP и отбросите ссылку на параметр на полученный inner Класс, тип которого определяется аргументом шаблона, который вы выводите.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top