我在编译可以轻视的代码时遇到错误,如下所示:
#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作为模板类会导致所描述的错误。 有关原因和如何解决问题的任何想法?
答案 0 :(得分:5)
没有限定insideClass
是一个非依赖名称,在第1阶段查找期间查找。由于根据模板参数定义基数是未知的,因此将忽略基类中的名称并找不到名称。资格并可能在战略位置添加typename
应解决问题(感谢remyabel的符号):
typename A<T>::template insideClass<T> ic;
需要template
关键字来表示即将发布的内容是模板,并且需要typename
来指示恰好是类型。获取依赖名称的正确拼写有时并不完全是直截了当的。显示问题的SSCCE为here,解决方案为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;
};