2013-12-09 20 views
6

İki vektör için skaler ürünü sayan işlevi yazmaya çalışıyorum. İşte kod ve çalışır.Birden çok türdeki yinelemeli şablon işlevi

template <int N> 
    int scalar_product (std::vector<int>::iterator a, 
         std::vector<int>::iterator b) { 
     return (*a) * (*b) + scalar_product<N - 1>(a + 1, b + 1); 
    } 

    template <> 
    int scalar_product<0>(std::vector<int>::iterator a, 
          std::vector<int>::iterator b) { 
     return 0; 
    } 

Ama burada sorun - ı derlemek olsun - İşlevin bu imza bu

template <typename Iterator ,int N> 
    int scalar_product (Iterator a, Iterator b) { 
     return (*a) * (*b) + scalar_product<N - 1>(a + 1, b + 1); 
    } 

    template <typename Iterator> 
    int scalar_product<0>(Iterator a, 
          Iterator b) { 
     return 0; 
    } 

gibi yetiremediğin bakacağız Ama bu işe yaramazsa yüzden, şablon türü ile bu yineleyicinızı değiştirmek istiyor hata C2768: açık şablon bağımsız değişkenlerinin yasa dışı kullanımı. Aptalca görünüyor, ama bu hatayı önlemek için neyi değiştirmeliydim.

+0

bakınız: http://stackoverflow.com/questions/3716799/partial-specialization- of-function-templates – Nim

+0

Neden ['std :: inner_product'] (http://en.cppreference.com/w/cpp/algorithm/inner_product) kullanılmıyor? Döngüyü dizginlemek senin için çok önemli mi? – gwiazdorrr

+0

@Nim Bağlantı için teşekkürler - yardımcı oldu. – htzfun

cevap

4

(AFAIK) işlevi şablonları kısmi uzmanlaşma için destek yoktur, bu işlevselliği elde etmek, sen biraz daha farklı gibi bir şey yapmak gerekir: Aslında

template <int N> 
struct scalar 
{ 
    template <typename Iterator> 
    static int product(Iterator a, Iterator b) 
    { (*a) * (*b) + scalar<N - 1>::product(a + 1, b + 1); } 
}; 

template <> 
struct scalar<0> 
{ 
    template <typename Iterator> 
    static int product(Iterator a, Iterator b) 
    { return 0; } 
}; 
5

, kullanmak gerekmez türleri - onları oldukça hantal buluyorum ve semantikleri farklı. Sen kısmen bir işlev uzman olamaz, ancak bunları aşırı ve varsayılan parametre değerleri sağlayarak onları uzmanlık gibi davranır yapabilirsiniz: Bu

#include <type_traits> 

template <typename Iterator> 
int scalar_product(Iterator a, Iterator b, std::integral_constant<int, 0> = std::integral_constant<int, 0>() ) 
{ 
    return 0; 
} 

template <int N, typename Iterator> 
int scalar_product (Iterator a, Iterator b, std::integral_constant<int, N> = std::integral_constant<int, N>()) 
{ 
    return (*a) * (*b) + scalar_product(a + 1, b + 1, std::integral_constant<int, N-1>()); 
} 

int foo() 
{ 
    int a[] = { 1, 2, 3, 4 }; 
    int b[] = { 1, 1, 1, 1 }; 
    return scalar_product<4>(a, b); // returns 10 
} 
İlgili konular