У меня есть следующий фрагмент кода:
template
struct X {
template
X(T t) {}
};
template
void f(X x, A a) {}
int main() {
f(0, 0);
}
который не удалось скомпилировать (gcc 14.1.1) со следующей ошибкой:
test.cc:20:10: error: no matching function for call to ‘f(int, int)’
20 | f(0, 0);
| ~^~~~~~
test.cc:17:6: note: candidate: ‘template void f(X, A)’
17 | void f(X x, A a) {}
| ^
test.cc:17:6: note: template argument deduction/substitution failed:
test.cc:20:10: note: mismatched types ‘X’ and ‘int’
20 | f(0, 0);
| ~^~~~~~
Если я правильно понимаю, любое значение должно быть конвертировано в X из-за шаблонного конструктора X(T)
Но вот что интересно заключается в том, что static_assert не вызывает ошибку времени компиляции:
static_assert(std::is_convertible_v); // no assertion failure
Как изменить программу, чтобы сохранить оба шаблона и разрешить преобразование в X?
[РЕШЕНИЕ] Чтобы разрешить преобразования, нам нужно отключить вычет для X:
void f(std::type_identity_t x, A a)
// or
void f(X x, A a)
Подробнее здесь: https://stackoverflow.com/questions/787 ... -happening
Неявное преобразование параметров функции не происходит ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Сопоставление вызываемых подписей, запрещающее неявное преобразование параметров.
Anonymous » » в форуме C++ - 0 Ответы
- 13 Просмотры
-
Последнее сообщение Anonymous
-