2017-02-04 3 views
2

Я хочу создать шаблон, как это, которое может вывести шаблон класса TT тип T:Шаблон в качестве параметра шаблона функции - вычет не в состоянии

#include <iostream> 
#include <algorithm> 
#include <vector> 

using namespace std; 

template < template <typename> class TT, typename T> 
T f(TT<T*> & A){ 
    cout << "it works\n"; 
    return *A[0]; 
}; 


int main(){ 
    vector<int*> v; 
    f(v); 
    return 0; 
} 

У меня есть ошибка (с лязгом-4.0):

temded2.cpp: In function ‘int main()’: 
temded2.cpp:20:21: error: no matching function for call to ‘f(std::vector<int*>&)’ 
    f<std::vector>(v); 
        ^
temded2.cpp:12:3: note: candidate: template<template<class> class TT, class T> T f(TT<T*>&) 
T f(TT<T*> & A){ 
^

Я думаю, что TT должно быть равно std :: vector, а T должно быть равно int, что я делаю неправильно?

ответ

4

Ваш шаблон шаблона не такой, как вы думаете. Есть больше для std::vector<T>, чем вы думаете, включая параметры шаблона по умолчанию, которые вы не учитываете. К счастью, VARIADIC аргументы в C++ 11 поможет вам решить эту проблему

#include <iostream> 
#include <vector> 

template < template <typename, typename...> class TT, typename T, typename... Args> 
T f(TT<T*, Args...> & A) 
{ 
    std::cout << __PRETTY_FUNCTION__ << '\n'; 
    if (A.size() > 0) 
     return *(A[0]); 
    return T(); 
}; 

int main() 
{ 
    std::vector<int*> v; 
    f(v); 
    return 0; 
} 

Выходной

T f(TT<T *, Args...> &) [TT = vector, T = int, Args = <std::__1::allocator<int *>>] 

Обратите внимание на Args выше. Потому что они отсутствуют в вашем самом шаблона-шаблона ожидаемого списка аргументов, нет совпадения. Как вы можете видеть, вариативные аргументы могут решить эту проблему.

+0

Спасибо, работает, когда у меня есть: шаблон <шаблон class TT, typename T> не нужен третий параметр. – peterSweter

+0

@peterSweter Рад, что это помогло. Я включил переменный аргумент для демонстрации с помощью функции g ++/clang ++ pretty-function, которая действительно создается при вызове из 'main()'. Рад, что это имеет смысл. – WhozCraig

4

std::vector шаблон класса, который принимает два параметра шаблона:

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

Ваш f ожидает шаблон класса только с одним параметром шаблона. Так что это просто не соответствует.

2

Поскольку вектор шаблон с два параметром шаблона, один для типа элементов, и один для распределителя,

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

Вашего temlate параметр B также необходим два параметра шаблона, так что функция выглядит это:

template <template <typename, typename> class V, typename T, typename A> 
T f(V<T, A>& arg){ 
    cout << "it works\n"; 
    return arg[0]; 
}; 

Теперь функция работает.

Смежные вопросы