Я хотел бы проверить, что следующее является ошибкой в GCC, а не в моем понимании С++. Рассмотрим следующий код:
struct A
{
struct B
{
template< typename U > U as() const { return U(); }
};
B operator[]( int ) const { return B(); }
};
template< typename T >
struct as
{
template< typename U >
static T call( const U& u )
{
return u[ 0 ].as< T >(); // accepted by Clang 3.2, rejected by GCC 4.7
// return u[ 0 ].template as< T >(); // does not help and is IMHO not needed
// return u[ 0 ].A::B::as< T >(); // accepted by GCC 4.7
}
};
int main()
{
as< int >::call( A() );
}
IMHO код должен быть точным, он принят Clang 3.2, но не GCC 4.7 (4.4 и 4.6 тоже не сбой с той же самой ошибкой, но 4.4 дает немного другое сообщение). Здесь вывод из моей оболочки:
$ clang++-3.2 -O3 -Wall -Wextra -std=c++0x t.cc -o t
$ g++-4.7 -O3 -Wall -Wextra -std=c++0x t.cc -o t
t.cc: In static member function ‘static T as<T>::call(const U&)’:
t.cc:17:21: error: invalid use of ‘struct as<T>’
t.cc: In static member function ‘static T as<T>::call(const U&) [with U = A; T = int]’:
t.cc:18:4: warning: control reaches end of non-void function [-Wreturn-type]
$
Вопрос: Является ли это ошибкой в GCC или мне что-то не хватает?
EDIT: Я немного смущен: отчет об ошибке GCC в http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55576 говорит в комментарии # 9, что код в комментарии # 3 "действителен". Что именно это значит? Похоже, что люди GCC считают, что на самом деле это ошибка, иначе они уже закрыли бы ее? OTOH ответ от @Potatoswatter кажется совершенно ясным, что он должен быть правильным, и я должен подать отчет об ошибке против Clang (или там уже есть такой отчет об ошибке?)
Обратите внимание, что я смущаюсь отмечать ответ как принятый до тех пор, пока не будет разъяснено выше. Поскольку оба ответа уже полезны (один для объяснения, один для обхода), я дал оба значения.
Бонусный вопрос: так как я получил нисходящий рейтинг для ненавязчивого кода, мне интересно, как это себя чувствуют другие. Я попытался создать SCCEE, который удаляет все отвлечения и концентрирует внимание на технической проблеме. Это то, что я предпочитаю думать об этих вещах. Это неправильно?
Кроме того, @EdHeal: Почему код подвержен катастрофе? (Вы не думаете, что это реальный код, который у меня есть?)
EDIT2: Спасибо, Дэвид, просто заметил ваше редактирование. Я помечаю ваш ответ как принятый сейчас, и я также заметил, что вы прокомментировали сообщение об ошибке GCC. Я думаю, что главный вопрос этого вопроса ответил на это, и GCC получил еще одно напоминание. Спасибо всем.