模板类继承的c ++问题

时间:2013-12-22 18:33:50

标签: c++ templates inheritance

我在编译可以轻视的代码时遇到错误,如下所示:

#include<iostream>

template <class T>
class A
{
    protected:
        T protectedValue;

        template<class TT>
        class insideClass
        {
            public:
                TT insideClassValue;
        };
};

template<class T>
class B : public A<T>
{
    public:
        void print(T t)
        {
            insideClass<T> ic;    // <-- the problem should be here
            ic.insideClassValue = t;
            std::cout << ic.indideClassValue << std::endl;
        };
};

int main()
{
    double v = 2.;
    B<double> b;
    b.print(v);

    return 0;
};

编译器(g ++)给出以下错误:

main.C: In member function ‘void B<T>::printA()’:
main.C:23:4: error: ‘insideClass’ was not declared in this scope
main.C:23:17: error: expected primary-expression before ‘>’ token
main.C:23:19: error: ‘ic’ was not declared in this scope

我发现如果A类不是模板类,编译不会给出任何错误。 我不明白为什么将类A作为模板类会导致所描述的错误。 有关原因和如何解决问题的任何想法?

2 个答案:

答案 0 :(得分:5)

没有限定insideClass是一个非依赖名称,在第1阶段查找期间查找。由于根据模板参数定义基数是未知的,因此将忽略基类中的名称并找不到名称。资格并可能在战略位置添加typename应解决问题(感谢remyabel的符号):

typename A<T>::template insideClass<T> ic;

需要template关键字来表示即将发布的内容是模板,并且需要typename来指示恰好是类型。获取依赖名称的正确拼写有时并不完全是直截了当的。显示问题的SSCCEhere,解决方案为here

答案 1 :(得分:1)

这样的事情:

typedef typename A<T>::template insideClass<T> ic; 
public:
    void print(T t)
    {
        ic ic;
        ic.insideClassValue = t;
        std::cout << ic.insideClassValue << std::endl;
    };