关于c ++:基类模板实例化,取决于派生类构造函数参数类型

Base class template instantiation depending on derived class constructor argument type

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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;
}

error C2664: 'foo::foo(T)' : cannot convert parameter 1 from 'int' to 'T'

我理解错误,但为什么呢?


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

  • bar取决于模板参数Tbar应为模板:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    template<class T>
    class bar : public foo<T>
    {
    public:
        bar(int a):foo(a){}
    };


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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class bar : public foo<int>
    {
    public:
        bar(int a):foo(a){}
    };


    int main()
    {
        bar obj(10);
    }

  • 小精灵