Шаблони як параметри шаблону
Є в шаблонах С ++ цікава можливість параметризованих самі параметри шаблонів. Щоб це могло означати?
Бувають випадки, коли параметр шаблону сам є шаблонною класом і для його інстанцірованія теж потрібно вказати параметр. Наприклад, універсальна шаблонна функція для друку стандартного контейнера будь-якого типу в потік:
І все б нічого, але з тільки зору синтаксису С ++ це невірно. Не можна просто написати C
Тепер повний приклад (template_parameter.cpp):
І запускаємо скомпільований файл:
Чітко видно, що на першому рядку роздруковані цілі, на другий речові, на третій символи, і на четвертій рядки.
template_as_parameter.cpp (38). error C3208: 'print'. template parameter list for class template 'std :: vector' does not match template parameter list for template template parameter 'C'
З чого я зробив висновок, що мікрософтовскій компілятор не підтримує подібний синтаксис.
Я був дуже засмучений подібним фактом, так як в цілому дуже позитивно ставлюся до cl.exe. А тут виходить, що навіть борландовий компілятор це розуміє, а cl.exe немає. Якщо хто знає, може є ключик який секретний для включення підтримки "хитрих і рідкісних" можливостей С ++ в компіляторі Мікрософтвера - навчіть, будь ласка. Буду дуже вдячний.
Передбачаючи питання типу "навіщо так складно, та ще й погано переносимо" - все вірно. Особисто я б відніс все вище описане до "темних кутках" С ++, але аж надто цікаво за ними полазити.
У шаблонів стандартних контейнерів є другий параметр, так званий allocator. Цей параметр часто використовується із значенням за замовчуванням, тому рідко доводиться згадувати про нього. І як уточнив Олександр, моя проблема була в тому, що cl.exe вимагає явної вказівки наявності цього параметра при параметризації параметра C.
Виправлений код компілюється у всіх випробуваних компіляторах, тепер включаючи і cl.exe.
Інші пости по темі: