Я заметил другое поведение между gcc
9.2.0 и clang++
9.0.1. Мой код выглядит следующим образом:
//header.hh
...
template <typename T>
class Outer {
...
public:
template <typename S>
class Inner;
...
};
template <typename T>
template <typename S>
class Inner {
...
Inner& func();
...
};
, так как функция func()
реализована в другом файле
//implementation.cc
template <typename T>
template <typename S>
Outer<T>::Inner<S>& Outer<T>::Inner<S>::func() {
...
};
Теперь, если я использую g++
, компиляция в порядке. Если я использую clang++
, я получаю
src/implementation.cc:6:1: error: missing 'typename' prior to dependent type template name 'Outer<T>::Inner'
Outer<T>::Inner<S>& Outer<T>::Inner<S>::func() {
^
1 error generated.
Однако, если я последую его предложению и использую
typename Outer<T>::Inner<S>& Outer<T>::Inner<S>::func()
, я получу еще одну ошибку:
src/implementation.cc:6:21: error: use 'template' keyword to treat 'Inner' as
a dependent template name typename Outer<T>::Inner<S>& Outer<T>
::Inner<S>::func() {
И теперь его предложение кажется очень странным.
ВОПРОСЫ
- Почему два компилятора ведут себя по-разному?
- Какой правильный синтаксис использовать?