Обходной путь для вычета аргумента шаблона в контексте без направления
-
25-10-2019 - |
Вопрос
Рассмотрим следующий код:
#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
это неоснованный контекст (как объяснено здесь), то есть тип шаблона-аргументации не может быть выведен компилятором (чтение этот ответ за почему). Как я вижу, у меня есть два варианта, чтобы заставить его работать:
- Шаг
inner
снаружиouter
И сделать это классовым-теплу. Я предпочитаю это, потому что влияние на использование кода меньше. - Добавить
to_string
-Мете к внутреннему.
Есть ли какие -либо другие решения для этого (которые не приводят к уродливому синтаксису в коде использования)?
Решение
Вы можете переместить оператора в корпус внутреннего класса и положить friend
перед этим. Затем замените тип параметра на просто inner
.
Другой метод состоит в том, чтобы получить внутреннее из базы CRTP, параметризованного Inner. Затем сделайте параметр введите класс CRTP и отбросите ссылку на параметр на полученный inner
Класс, тип которого определяется аргументом шаблона, который вы выводите.