基类模板实例化取决于派生类构造函数参数类型

时间:2011-01-06 20:42:32

标签: c++ templates

在下面,基于派生类构造函数参数类型,编译器不应该生成基类构造函数吗?

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)':无法将参数1从'int'转换为'T'

我理解错误,但为什么会这样?

1 个答案:

答案 0 :(得分:5)

class bar : public foo<class T>中的语法不正确。

  • bar取决于模板参数T,而bar应该是模板:

    template<class T>
    class bar : public foo<T>
    {
    public:
        bar(int a):foo(a){}
    };
    
    
    int main()
    {
        bar<int> obj(10);
    }
    
  • 或者您希望barfoo的特定实例继承,例如:

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