рассмотрим этот пример (https://godbolt.org/z/hre3yezpd):образно
Код: Выделить всё
#include
class Foo {
template
void WriteNestedMessage(uint32_t field_number, Write write_message);
protected:
void Write();
};
template
void Foo::WriteNestedMessage(uint32_t field_number, Write write_message) {}
- У нас есть шаблон в классе Declaration метод с именем wrisenestestmessage . Его аргумент шаблона записывает тени имени защищенного метода записи .
- У нас есть шаблон вне класса определение для writenestestedmessage чей шаблон также называется write .
/> компиляторы < /h2>
clang принимает этот код без жалоб.Он ясно верит - в шаблоне определение - что записи ссылается на защищенный метод, а не параметр шаблона одного и того же имени. Противоречиво:Код: Выделить всё
:12:53: error: 'Write' is not a type 12 | void Foo::WriteNestedMessage(uint32_t field_number, Write write_message) {} | ^~~~~ :12:6: error: no declaration matches 'void Foo::WriteNestedMessage(uint32_t, int)' 12 | void Foo::WriteNestedMessage(uint32_t field_number, Write write_message) {} | ^~~ :5:8: note: candidate is: 'template void Foo::WriteNestedMessage(uint32_t, Write)' 5 | void WriteNestedMessage(uint32_t field_number, Write write_message); | ^~~~~~~~~~~~~~~~~~ :3:7: note: 'class Foo' defined here 3 | class Foo { | ^~~ :12:53: error: 'void Foo::Write()' is protected within this context 12 | void Foo::WriteNestedMessage(uint32_t field_number, Write write_message) {} | ^~~~~ :8:8: note: declared protected here 8 | void Write(); | ^~~~~ Compiler returned: 1
В определении члена шаблона класса, который появляется за пределами определения шаблона класса, имя элемента шаблона класса скрывает имя параметра шаблона любого класса класса, , но не параметр шаблона
Подробнее здесь: https://stackoverflow.com/questions/797 ... that-class