微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

具有两种类型的混淆C ++的模板

如何解决具有两种类型的混淆C ++的模板

我正在尝试创建一个创建数组类的简单模板。但是,我想使用两个参数:一个类型名和一个int变量。我遇到了两个错误,我不确定自己在做什么错。这是我的简单实用的资源。

int main()
{
    Array<int,7> tArray;
    std::cout << tArray.getSize() << std::endl;
    for (int i = 0; i < tArray.getSize(); i++)
    {
        tArray.insert(i + 5);
        i++;
    }
    tArray.printArray();
    return 0;
}

我遇到的错误/问题与我的头文件中的两个函数有关。

#pragma once

template <typename T,int S>
class Array
{
private:
    T arr[S];
public:
    Array();
    int getSize() const;
    int insert(T val);
    void printArray();
    ~Array();
};  
cArray<T,S>::cArray() { }
template <typename T,int S>
int Array<T,S>::insert(T val)
{
    Array<T,S>* temp = new Array[S];
    temp = this;
    return temp[val];
}

template <typename T,int S>
void Array<T,S>::printArray()
{
    Array<T,S>* temp = new Array[S];
    temp = this;
    for (int i = 0; i < S; i++)
    {
        std::cout << tempArray[i] << std::endl;
    }
}

函数insert和printArray不起作用。对于insert函数,返回的错误状态为:抑制状态错误C2440'return':无法从'Array '转换为'int' printArray什么也没显示

这是我第一次使用带有两个参数的模板,因此我对自己在这里做错的事情有些困惑。有需要吗?

解决方法

违规代码在这里:

template <typename T,int S>
int Array<T,S>::insert(T val) {
    Array<T,S>* temp = new Array[S];
    temp = this;
    return temp[val];
}

首先,您创建一个Array数组,因为您编写的表达式类似于:

Type *var = new Type[count];

然后将指向该数组的指针更改为this。然后,您尝试返回数组val的索引temp处的元素,并且该元素的类型为Array<T,S>。但是,返回类型为int,因此,编译器会抱怨无法将Array<int,7>转换为int

您完全不应在此处使用new。您已经为数组分配了内存(这是成员变量arr),您只需要将val复制到该数组的正确位置即可。为此,您需要跟踪已在数组中插入了多少个元素。 (请注意,S是一个常数,仅说明您可以存储的最大元素数量。)因此:

template <typename T,int S>
class Array {
    T arr[S];
    size_t size = 0;
...
};

template <typename T,int S>
void Array<T,S>::insert(T val)
{
    arr[size++] = val;
}

template <typename T,int S>
size_t Array<T,S>::getSize()
{
    return size;
}

printArray()也有类似的问题。您应该打印arr的内容,不要创建新的临时数组并尝试打印其元素。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。