Tenho as duas funções a seguir, mas sempre recebo este erro do compilador:
deduziu tipos conflitantes para o parâmetro 'T'
Imagino que o problema é que T
se refere a um array e int
ao mesmo tempo, mas como eu poderia resolver esse problema? Se bem me lembro, já vi algo parecido sendo feito com a adição de mais algum código à template
parte, mas não consegui encontrar isso agora.
template<typename T>
int binSearch(const T& A, int u, int v, T x) {
if (u > v) return 0;
int m = (u + v) / 2;
if(A[m] > x) return binSearch(A, u, m-1, x);
if(A[m] < x) return binSearch(A, m+1, v, x);
else return m;
}
template<typename T>
int logSearch(const T& A, T x) {
return binSearch(A, 0, sizeof(A) / sizeof(A[0]), x);
}
exemplo de como quero usar esta função:
#include <iostream>
#include "..\binSearch.hh"
int main() {
int asd[] = {0,1,2,3,4,5,6,7,8,9};
std::cout << logSearch(asd, 3);
return 0;
}
Ao compilar este arquivo com g++, recebo o seguinte:
g++ .\Algorithms\tests\example.cpp
.\Algorithms\tests\example.cpp: In function 'int main()':
.\Algorithms\tests\example.cpp:8:27: error: no matching function for call to 'logSearch(int [10], int)'
8 | std::cout << logSearch(asd, 3);
| ~~~~~~~~~^~~~~~~~
In file included from .\Algorithms\tests\example.cpp:3:
.\Algorithms\tests\..\binSearch.hh:15:5: note: candidate: 'template<class T> int logSearch(const T&, T)'
15 | int logSearch(const T& A, T x) {
| ^~~~~~~~~
.\Algorithms\tests\..\binSearch.hh:15:5: note: template argument deduction/substitution failed:
.\Algorithms\tests\example.cpp:8:27: note: deduced conflicting types for parameter 'T' ('int [10]' and 'int')
8 | std::cout << logSearch(asd, 3);
| ~~~~~~~~~^~~~~~~~
Para responder à sua pergunta imediata, para criar um modelo de função que aceite uma matriz de
T
s e umT
elemento, você precisa usar a seguinte sintaxe:Notas:
const &
(ieT const & x
) para evitar cópia (o que não é significativo paraint
s, mas pode ser para outrosT
s).Live demo
Entretanto, em C++ geralmente não é recomendado usar matrizes C simples.
Em vez disso, você pode usar use
std::vector
(oustd::array
para matrizes de tamanho estático):Ou neste caso, como @Useless comentou , use
std::ranges::random_access_range
que é mais geral e pode ser usado comstd::vector
,std::array
etc.