2010-05-04 1 views
2

при тестировании с другой версией г ++, следующая проблема пришлаC++ параметр шаблона/класс неоднозначность

template<class bra> 
struct Transform<bra, void> : kernel::Eri::Transform::bra { 
     static const size_t ni = bra::A::size; 

bra::A интерпретируется как kernel::Eri::Transform::bra::A, а не шаблон аргумента г ++ 4.1.2. с другой стороны, g ++ 4.3 исправляет это.

Какое должно быть правильное поведение в соответствии со стандартом?

Между тем, я немного реорганизую, чтобы проблема исчезла.

+1

Даже если 4.3 делает правильную вещь, вероятно, хорошая идея не дублировать имена, потому что вы будете путать ад с теми, кто читает код иначе. –

+0

@Bil это была часть рефакторинга. Я убираю какую-то мозговую штурм – Anycorn

+1

GCC4.5 исправлен и делает это как 4.1, по крайней мере, в моем тесте. –

ответ

4

Мне кажется, что gcc 4.1.2 был прав. §14.6.1/7 (ISO/IEC 14882, C++, 03):

В определении шаблона класса или в определении члена такого шаблона, который выходит за пределы шаблона определение для каждого базового класса, который не зависит от шаблона-параметра (14.6.2), если имя базового класса или имя элемента базового класса совпадает с именем параметра шаблона, имя базового класса или имя участника скрывает имя параметра шаблона (3.3.7).

+0

спасибо. можете ли вы предоставить мне ссылку на стандарт? Я нашел 19 апреля 2000 г. rev. это достаточно хорошо (это относится к этой конкретной проблеме)? – Anycorn

+0

@aaa: Я имел в виду C++ 03, должен быть окончательный проект онлайн. См. Здесь ссылки и т. Д .: http://stackoverflow.com/questions/81656/where-do-i-find-the-current-c-or-c-standard-documents –

+0

Я всегда удивляюсь, когда люди могут придумать точный абзац из стандарта: p –