2016-11-14 16 views
-3

私は値をゼロまでカウントする機能を持ちたいと思っています。さらに、クラスがテンプレートパラメータとして渡されるいくつかのコードを呼びたいと思います。 しかし、このコードは機能しません。誰かが私を助けることができますか? ありがとうございました。テンプレート関数を使用してクラスを呼び出すC++再帰関数

は、エラーメッセージは次のとおりです。

class Hello_World 
{ 
    public: 
     void hello(size_t number){ 
      cout << "hello " << number << endl; 
     } 
}; 


template<size_t SIZE, class T> 
void foo() 
{ 
    T t; 
    t.hello(SIZE); 
    foo<SIZE-1, Hello_World>(); 
} 

template<class T> 
void foo<0,T>() 
{ 
    cout << "end." << endl; 
} 

int main() 
{ 
    foo<4,Hello_World>(); 
} 
+1

何をして動作しません、あなたはこれまでに、クラッシュし、コンパイルされていない試してみましたが、何...? – Zouch

+0

[MCVE]と表示されるエラーメッセージを入力してください。このコードはいくつかの理由でコンパイルされません。 – user463035818

答えて

0

を "関数テンプレート部分的な特殊化 'fooの< 0、T>' は許可されていません" あなたは、部分的にテンプレート関数を特化することはできません。クラス内でラップします。

template <size_t SZ, typename T > 
struct foo_impl 
{ 
    static void call() 
    { 
     T().hello(SZ); 
     foo_impl<SZ-1, T>::call(); 
    } 
}; 

template < typename T > 
struct foo_impl<0,T> 
{ 
    // you get the idea... 
}; 

template <size_t SZ, typename T > 
void foo() { foo_impl<SZ,T>::call(); } 
+0

あなたの答えは、このコードは完全には動作しませんが、 "'call'は" foo_impl <0u、Hello_World> '"の行" foo_impl :: call();のメンバーではありません "というエラーメッセージが表示されます。 ;私はそれを "foo <3、Hello_World>();"と呼びます。 " –

+0

@doktormoreauはもちろん実装する必要があります。置き換える: ''あなたは '' call() 'の実装で "//あなたはアイデアを得ます" – user463035818

+0

ああ、それは動作します、ありがとう、ありがとう。 –

0

関数テンプレートを部分的に特殊化することはできません。ただし、部分的に(基本的には、関数のように作用すること)ファンクタを特化することができます

#include <iostream> 

template<size_t SIZE, class T> 
struct foo { 
    void operator()(){ foo<SIZE-1, T>()(); } 
}; 

template<class T> 
struct foo<0,T> { 
    void operator()(){ std::cout << "end." <<std::endl; } 
}; 

int main(){ 
    foo<3,int>()(); 
} 
+0

これも、ありがとうございます。 –

関連する問題