2016-10-05 4 views
3

Aus irgendeinem Grund bekomme ich keine passenden Anruffehler, trotz meiner Erwartungen. Warum passiert das?Vorlage Vorlage Argumente: kein passender Anruf gefunden

+1

Wo ist der Typ 'X' definiert? Warum kehren Sie von einer "void" -Funktion zurück? –

+1

Schauen Sie sich std :: vector declaration an. –

+0

Was versuchst du in der Testfunktion zu tun ..? –

Antwort

4

std::vector nimmt nicht ein Argument, aber zwei (es gibt Allocator), so dass es nicht gegen eine Vorlage, die nur eine nehmen sollte, abgestimmt werden kann. Sie müssen entweder ändern:

template <template <typename, typename> class x> 
// or: 
template <template <typename... > class x> 

Sie müssen auch den Rückgabetyp Ihrer Funktion ändern, da es unwahrscheinlich ist, dass x<int>void ist.

Beachten Sie, wenn Sie die Version mit zwei typename verwenden, würden Sie jeden Parameter in der return-Anweisung (z x<int, std::allocator<int>>) angeben müssen, weshalb Sie die variadische Version bevorzugen sollen (typename...).

+0

Also sollte ich jeden Template-Parameter auflisten? – RomaValcer

+1

@RomaValcer Ja, oder verwenden Sie eine variadische Version. – Holt

2

std :: vector template sieht wie folgt aus:

template< 
    class T, 
    class Allocator = std::allocator<T> 
> class vector; 

so haben Sie Type-Name T und Allocator für sie, so der richtige Code sein sollte:

template<template<typename,typename> class x> 
void test() { 
    x<int, std::allocator<int>>(); 
} 
Verwandte Themen