#include
#include
class MyBar {
public:
void print() {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};
template
class Foo{
public:
Foo(const char* name, const uint32_t i) {
Bar b;
b.print();
}
};
int main(int argc, char** argv) {
auto pFoo1 = new Foo("abc", 3);
}
Le compilateur m'a donné :
template_ctor.cpp: Dans la fonction ‘int main(int, char**)’ :
template_ctor.cpp:21:31: erreur: l'inférence d'argument de modèle de classe a échoué :
auto pFoo1 = new Foo("abc", 3);
^
template_ctor.cpp:21:31: erreur: aucun appel de fonction correspondant pour ‘Foo()’
template_ctor.cpp:14:2: note: candidat: template Foo(const char*, uint32_t)-> Foo
Foo(const char* name, const uint32_t i) {
^~~
template_ctor.cpp:14:2: note: déduction/substitution d'argument de modèle a échoué :
template_ctor.cpp:21:31: note: le candidat attend 2 arguments, 0 fournis
auto pFoo1 = new Foo("abc", 3);
Aussitôt que je mets <>
après new Foo
, cela compile.
Au début, je pensais que <>
était obligatoire pour indiquer au compilateur d'utiliser le paramètre de modèle par défaut, mais ensuite j'ai remarqué que si je supprime const char* name
et que je ne passe pas "abc"
, alors cela compile également.
Maintenant, je suis confus.