【问题标题】:Template with Two Types Confusion C++具有两种类型混淆 C++ 的模板
【发布时间】:2020-09-19 21:13:35
【问题描述】:

我正在尝试制作一个创建数组类的简单模板。但是,我想使用两个参数:一个类型名和一个 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 函数不起作用。对于插入函数,返回的错误状态为:Suppression State Error C2440 'return': cannot convert from 'Array' to 'int' printArray 没有显示任何内容。

这是我第一次使用带有两个参数的模板,所以我对我在这里做错了什么感到有点困惑。有需要吗?

【问题讨论】:

  • 能否精简您的代码以专注于insert 函数?你觉得这个功能有什么作用? (目前,它没有任何用处。)
  • 想想new Array[S]; 的作用。
  • 刚刚将代码修剪为有错误的函数。我希望函数将值 (val) 添加到调用它的数组中。
  • @SmithJohn 你已经描述了你希望这个函数作为一个整体来完成什么。我想知道你认为它的每一行是做什么的。
  • @JaMiT 第一行创建一个临时数组。下一行将把它设置为等于发送给函数的数组/数据(它持有)。一旦临时数组获得了信息,我将返回要输入的数字的值,同时将其附加到数组中的给定插槽。这就是它背后的思考过程。

标签: c++ function templates


【解决方案1】:

有问题的代码在这里:

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

首先,您创建了一个 Arrays 数组,因为您编写了如下表达式:

Type *var = new Type[count];

然后将指向该数组的指针更改为this。然后尝试返回数组temp 的索引val 处的元素,并且该元素的类型为Array&lt;T, S&gt;。但是,返回类型是int,所以,这就是编译器抱怨它无法将Array&lt;int, 7&gt; 转换为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的内容,你不应该创建一个新的临时数组并尝试打印它的元素。

【讨论】:

  • 谢谢,这个答案帮助我了解我做错了什么。我想我必须创建一个临时数组才能插入每次发送的每个值。我还有一个与原始问题无关的快速问题。我的默认构造函数 cArray() 用绿色波浪线加下划线,表示它未初始化并且应始终初始化。在我的案例/程序中,虽然不需要初始化它,对吧?
  • 我不确定,因为我看不到 class CArray 的其余部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-24
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多