class A : public B
{
// ...
};
// ...bool TestMethod(const B& value);
template<typename TYPE>
bool TestMethod(const TYPE& value);
// ...
A myclass;
TestMethod(myclass);
Результат — подставляется шаблонная. Почему? Искал в книгах и по форуму (в частности тут
1) нешаблонная функция с совпадающими типами аргументов (с точностью до rvalue/lvalue)
2) нешаблонная функция с приводимыми аргументами (неявный статик-каст), и, на том же уровне приоритета,
2) шаблоны функций, для которых удалось выполнить сопоставление параметров — от наиболее конкретных к наиболее общим
— 2.1) в рамках выбранного шаблона — специализация с совпадающими аргументами
— 2.2) основной шаблон
3) функции с троеточием
Если я неправ и запутался, как мне заставить подставить не шаблонный вариант в моем случае?
ATP>2) нешаблонная функция с приводимыми аргументами (неявный статик-каст), и, на том же уровне приоритета
Нее, это создавало бы кучу проблема из-за предположений компилятора о выводимости типов.
Здравствуйте, denisko, Вы писали:
ATP>>2) нешаблонная функция с приводимыми аргументами (неявный статик-каст), и, на том же уровне приоритета D>Нее, это создавало бы кучу проблема из-за предположений компилятора о выводимости типов.
— ну не знаю, это Кодт написал в ответ на похожий вопрос.
А как мне всетаки быть в моей ситуации?
Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>1) нешаблонная функция с совпадающими типами аргументов (с точностью до rvalue/lvalue) ATP>2) нешаблонная функция с приводимыми аргументами (неявный статик-каст), и, на том же уровне приоритета, ATP>2) шаблоны функций, для которых удалось выполнить сопоставление параметров — от наиболее конкретных к наиболее общим ATP>— 2.1) в рамках выбранного шаблона — специализация с совпадающими аргументами ATP>— 2.2) основной шаблон ATP>3) функции с троеточием
Подстановка шаблона более приоритетна, чем статик-каст.
А чтобы решить конкретно твою ситуацию, нужно поиграться с диспетчеризацией
) — ожидал другого порядка подстановки:
ATP>1) нешаблонная функция с совпадающими типами аргументов (с точностью до rvalue/lvalue) ATP>2) нешаблонная функция с приводимыми аргументами (неявный статик-каст), и, на том же уровне приоритета, ATP>2) шаблоны функций, для которых удалось выполнить сопоставление параметров — от наиболее конкретных к наиболее общим ATP>— 2.1) в рамках выбранного шаблона — специализация с совпадающими аргументами ATP>— 2.2) основной шаблон ATP>3) функции с троеточием
ATP>Если я неправ и запутался, как мне заставить подставить не шаблонный вариант в моем случае?
Здравствуйте.
Обсуждение этого вопроса можно найти здесь:
Г.Саттер, А.Александреску "Стандарты программирования на С++. 101 правило и рекомендации"
"66.Не специализируйте шаблоны функций"
И на первый взляд, не соответствие стандарту.
В "Microsoft Visual Studio 2008" артефакт подтверждается.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
ATP>> — ну не знаю, это Кодт написал в ответ на похожий вопрос. ATP>>А как мне всетаки быть в моей ситуации?
L_L>явно кастить.
Странно как-то получается информация и типе на этапе компиляции есть, а воспользоваться я этим не могу никак, так что ли?
Здравствуйте, Владислав Курмаз, Вы писали:
ВК>Обсуждение этого вопроса можно найти здесь: ВК>Г.Саттер, А.Александреску "Стандарты программирования на С++. 101 правило и рекомендации" ВК>"66.Не специализируйте шаблоны функций"
ВК>И на первый взляд, не соответствие стандарту. ВК>В "Microsoft Visual Studio 2008" артефакт подтверждается.
ВК>С уважением, ВК>Владислав Курмаз.
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>>1) нешаблонная функция с совпадающими типами аргументов (с точностью до rvalue/lvalue) ATP>>2) нешаблонная функция с приводимыми аргументами (неявный статик-каст), и, на том же уровне приоритета, ATP>>2) шаблоны функций, для которых удалось выполнить сопоставление параметров — от наиболее конкретных к наиболее общим ATP>>— 2.1) в рамках выбранного шаблона — специализация с совпадающими аргументами ATP>>— 2.2) основной шаблон ATP>>3) функции с троеточием
К>Подстановка шаблона более приоритетна, чем статик-каст.
Этот порядок из вашего поста
К>А чтобы решить конкретно твою ситуацию, нужно поиграться с диспетчеризацией К>
Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>Здравствуйте, Владислав Курмаз, Вы писали:
ВК>>Обсуждение этого вопроса можно найти здесь: ВК>>Г.Саттер, А.Александреску "Стандарты программирования на С++. 101 правило и рекомендации" ВК>>"66.Не специализируйте шаблоны функций"
ВК>>И на первый взляд, не соответствие стандарту. ВК>>В "Microsoft Visual Studio 2008" артефакт подтверждается.
ВК>>С уважением, ВК>>Владислав Курмаз.
ATP>А где у меня специализация шаблона?
В совете как раз и дана рекомендация не использовать специализации, а использовать
перегрузки. И самое главное почему так надо делать.
В приведённом Вами коде, как раз и есть применение данной рекомендации.
Поэтому я и сделал предположение о не соответсвии стандарту в данном конкретном случае
и проверил артефакт на "Microsoft Visual Studio 2008"
Здравствуйте, Владислав Курмаз, Вы писали:
ВК>В совете как раз и дана рекомендация не использовать специализации, а использовать ВК>перегрузки. И самое главное почему так надо делать.
ВК>В приведённом Вами коде, как раз и есть применение данной рекомендации. ВК>Поэтому я и сделал предположение о не соответсвии стандарту в данном конкретном случае ВК>и проверил артефакт на "Microsoft Visual Studio 2008"
Так я книгу читал, и там тоже помню эту рекомендацию, так вот и запутался поэтому.
Здравствуйте, AcidTheProgrammer, Вы писали:
К>>Подстановка шаблона более приоритетна, чем статик-каст. ATP>Этот порядок из вашего поста
Ну бывает, погнал.
Интересно, что где-то я сталкивался именно с неоднозначностью из-за равенства приоритетов. Может быть, это был баг VC6? Или там какие-то хитрые условия и тёмные углы языка втречались? Не помню.
К>Интересно, что где-то я сталкивался именно с неоднозначностью из-за равенства приоритетов. Может быть, это был баг VC6? Или там какие-то хитрые условия и тёмные углы языка втречались? Не помню.
Возможно, что попутал с процедурой неявного приведения типов.
Наподобие вот этого http://codepad.org/gZdS2zko