2011-01-06 21 views
2

以下では、派生クラスのコンストラクタ引数の型に基づいてコンパイラによって生成される基底クラスのコンストラクタを使用しないでください。派生クラスのコンストラクタの引数型に応じた基本クラスのテンプレートのインスタンス化

template <class T> 
class foo 
{ 
int a; 
public: 
    foo(T a){} 
    // When I convert the constructor to a function template, it works fine. 
    // template <typename T> foo(T a){} 
}; 

class bar : public foo<class T> 
{ 
public: 
    bar(int a):foo(a){} 
}; 

int main(void) 
{ 
    bar obj(10); 
    system("pause"); 
    return 0; 
} 

エラーC2664: 'FOO :: FOO(T)': 'T'

に「int型からパラメータ1を変換することができない私は、エラーを理解するが、なぜそれがありますか?

答えて

5

class bar : public foo<class T>の構文が正しくありません。

  • どちらかbarテンプレートでなければなりませんテンプレートパラメータTbarによって異なります

    template<class T> 
    class bar : public foo<T> 
    { 
    public: 
        bar(int a):foo(a){} 
    }; 
    
    
    int main() 
    { 
        bar<int> obj(10); 
    } 
    
  • それともbarのようなfooの特定のインスタンス化を継承したい:

    class bar : public foo<int> 
    { 
    public: 
        bar(int a):foo(a){} 
    }; 
    
    
    int main() 
    { 
        bar obj(10); 
    } 
    
+0

f 'foo 'の 'T'は' bar'テンプレートパラメータも 'foo'テンプレートパラメータであると言っています。私は正しいですか? – Mahesh

+0

@Maheshはい、 'bar 'は 'foo 'から継承します – icecrime

関連する問題