Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 变量未声明,即使它是_C++_Variable Declaration - Fatal编程技术网

C++ 变量未声明,即使它是

C++ 变量未声明,即使它是,c++,variable-declaration,C++,Variable Declaration,我有一些简单的外观?模板友元运算符重载中的变量声明有问题。 编译器给了我一个信息: main.cpp | 103 |错误:“ptemp”未在此范围内声明| 代码: 当我进行声明时,编译器会给出一条消息,说明并没有声明的ptemp。擦除ptemp的初始化时也是如此。 我不明白这个声明有什么不对。如有任何建议,我将不胜感激。请尝试以下方法 typename Sequence<I,K>::Data *ptemp (cop.pHead); 试试下面的方法 typename Sequenc

我有一些简单的外观?模板友元运算符重载中的变量声明有问题。 编译器给了我一个信息:

main.cpp | 103 |错误:“ptemp”未在此范围内声明|

代码:

当我进行声明时,编译器会给出一条消息,说明并没有声明的ptemp。擦除ptemp的初始化时也是如此。 我不明白这个声明有什么不对。如有任何建议,我将不胜感激。

请尝试以下方法

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);
        ...
    }