C++ 变量未声明,即使它是
我有一些简单的外观?模板友元运算符重载中的变量声明有问题。 编译器给了我一个信息: main.cpp | 103 |错误:“ptemp”未在此范围内声明| 代码: 当我进行声明时,编译器会给出一条消息,说明并没有声明的ptemp。擦除ptemp的初始化时也是如此。 我不明白这个声明有什么不对。如有任何建议,我将不胜感激。请尝试以下方法C++ 变量未声明,即使它是,c++,variable-declaration,C++,Variable Declaration,我有一些简单的外观?模板友元运算符重载中的变量声明有问题。 编译器给了我一个信息: main.cpp | 103 |错误:“ptemp”未在此范围内声明| 代码: 当我进行声明时,编译器会给出一条消息,说明并没有声明的ptemp。擦除ptemp的初始化时也是如此。 我不明白这个声明有什么不对。如有任何建议,我将不胜感激。请尝试以下方法 typename Sequence<I,K>::Data *ptemp (cop.pHead); 试试下面的方法 typename Sequenc
typename Sequence<I,K>::Data *ptemp (cop.pHead);
试试下面的方法
typename Sequence<I,K>::Data *ptemp (cop.pHead);
问题似乎是Sequence::Data是一个依赖名称,编译器需要typename关键字的帮助才能知道该做什么。所以您需要说typename Sequence::Data*ptempcop.pHead;相反虽然我的第一个猜测是,在没有关键字的情况下,我无法理解它是如何解释的,因为通过最麻烦的解析进行的函数声明似乎不正确,因为在初始化中更改为an=并没有修复它
另外,您的内联好友声明可能是一个编译器特定的扩展,应该避免使用。我必须对您的代码进行多次更改,才能用g++4.5重现问题中的错误。问题似乎是Sequence::Data是一个依赖名称,编译器需要typename关键字的帮助才能知道该做什么。所以您需要说typename Sequence::Data*ptempcop.pHead;相反虽然我的第一个猜测是,在没有关键字的情况下,我无法理解它是如何解释的,因为通过最麻烦的解析进行的函数声明似乎不正确,因为在初始化中更改为an=并没有修复它 另外,您的内联好友声明可能是一个编译器特定的扩展,应该避免使用。我必须对您的代码进行多次更改,才能用g++4.5重现问题中的错误。名称序列::数据取决于I和K的定义:编译器无法知道数据是类型还是非类型,即模板实例序列中的值。因此,您需要通过在关键字typename前面加上前缀来告诉编译器它是一个类型,否则它会假定它是一个非类型,因此该行被解析为两个值的乘积,其中第二个值未知。有关详细说明,请参阅 此外,您还可以将friend非成员定义直接放在类中,而不使其成为成员!。然后,您可以使用Sequence简单地引用Sequence,并将您的子类型数据简单地引用为Data: 名称序列::Data取决于I和K的定义:编译器无法知道数据是类型还是非类型,即模板实例序列中的值。因此,您需要通过在关键字typename前面加上前缀来告诉编译器它是一个类型,否则它会假定它是一个非类型,因此该行被解析为两个值的乘积,其中第二个值未知。有关详细说明,请参阅 此外,您还可以将friend非成员定义直接放在类中,而不使其成为成员!。然后,您可以使用Sequence简单地引用Sequence,并将您的子类型数据简单地引用为Data:
尝试使用Sequence::Data*ptemp=cop.pHead;那个朋友宣言看起来很时髦。你确定没有从中得到任何错误吗?还有一点令人担忧的是,您似乎颠倒了模板参数的顺序;那个朋友宣言看起来很时髦。你确定没有从中得到任何错误吗?还有一点让人担心的是,你似乎颠倒了模板参数的顺序。这不完全是一个副本,但绝对值得一读:它对我有用,谢谢:但是你能解释一下为什么在这种特定情况下我必须使用typename关键字吗,或者给我一些文章来读一下?@juniorro,否则该名称将被视为数据成员而不是类型名称。@juniorro:Sequence::data是一个依赖于模板参数的名称,一个依赖名称,因此您需要typename来通知编译器它命名的是类型而不是值。否则,该声明将被解释为一个表达式:Sequence::Data与函数调用ptempcop.pHead的乘积!它适合我,谢谢:但是你能解释一下为什么在这种特定情况下我必须使用typename关键字,或者给我一些文章来阅读吗?@juniorro否则该名称将被视为数据成员而不是类型名称。@juniorro:Sequence::data是一个依赖于模板参数的名称,因此,您需要typename来通知编译器它命名的是一个类型而不是一个值。否则,该声明将被解释为一个表达式:Sequence::Data与函数调用ptempcop.pHead的乘积!
typename Sequence<I,K>::Data *ptemp (cop.pHead);
auto ptemp = cop.pHead;
public:
friend ostream &operator << (ostream& stream, const Sequence &cop)
{
Data *ptemp (cop.pHead);
...
}