gpt4 book ai didi

C++ 模板和指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:49 27 4
gpt4 key购买 nike

我对模板和指针有疑问(我认为)。以下是我的部分代码:

/* ItemCollection.h */

#ifndef ITEMCOLLECTION_H
#define ITEMCOLLECTION_H

#include <cstddef>

using namespace std;

template <class T> class ItemCollection
{
public:
// constructor
//destructor

void insertItem( const T );

private:
struct Item
{
T price;
Item* left;
Item* right;
};
Item* root;
Item* insert( T, Item* );

};
#endif

以及带有函数定义的文件:

/* ItemCollectionTemp.h-member functions defintion */

#include <iostream>
#include <cstddef>

#include "ItemCollection.h"

template <class T>
Item* ItemCollection <T>::insert( T p, Item* ptr)
{
// function body
}

下面是这行代码产生的错误:

Item* ItemCollection <T>::insert( T p, Item* ptr)

错误:

错误 C2143:语法错误:缺少“;”在“*”之前

错误 C4430:缺少类型说明符 - 假定为 int。注意:C++不支持default-int

错误 C2065:“类型”:未声明的标识符

错误 C2065:“类型”:未声明的标识符

错误 C2146:语法错误:在标识符“p”之前缺少“)”

错误 C4430:缺少类型说明符 - 假定为 int。注意:C++不支持default-int

error C2470: 'ItemCollection::insert' : 看起来像函数定义,但没有参数列表;跳过明显的 body

错误 C2072:“ItemCollection::insert”:函数初始化

error C2059: 语法错误: ')'

非常感谢任何帮助。

最佳答案

简短的回答是 Alexey 已经发布的内容:

template <typename T>
typename ItemCollection<T>::Item* ItemCollection<T>::insert( T p, Item * ptr ) {
// ...
}

(要了解为什么 typename 是必需的,请搜索 SO 以查找相关问题,或者发表评论。我会将答案集中在解释为什么必须以不同方式声明返回和参数类型的查找规则中)

解释是 c++ 中的查找规则对返回类型和其余参数具有不同的范围。当编译器看到定义 A B::c( D ) , A在定义的封闭命名空间中检查,如 B .当编译器找到 ::c它查找c内部类B .那时,定义的其余部分在类 B 的范围内对于其余参数。这意味着如果返回类型是类的内部类型,则必须使用限定名称作为返回类型,而在 D 的情况下编译器将首先在类 B 中查找它.

这解释了为什么返回类型必须是完全限定的,即使最后一个参数不是。当参数Item * ptr被编译器找到,它已经在类的范围内,它会在那里找到它。另一方面,没有 Item在封闭的命名空间中定义。

即将发布的标准中的一项更改将处理此问题,即使它在设计时并未考虑到此目的。如果我没记错的话,下面的语法应该在没有完整类型限定的情况下编译:

template <T>
auto ItemCollection<T>::insert( T p, Item * ptr ) -> Item *
{
return 0;
}

道理完全一样。在ItemCollection<T>::insert之后已解析剩余 token 将在 ItemCollection<T> 内进行验证范围,包括 -> Item *返回定义。

关于C++ 模板和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2629346/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com