gpt4 book ai didi

c++ - 模板函数特化,C++

转载 作者:行者123 更新时间:2023-11-28 01:03:38 26 4
gpt4 key购买 nike

我正在练习函数特化,我正在尝试创建一个带有专门打印函数的小存储对象。这是我的代码:

#ifndef STORAGE_HPP_
#define STORAGE_HPP_

#include <iostream>

using namespace std;

template <typename T, int size> class Storage
{ //LINE 16 ERROR
public:
Storage():arr(new T*[size]){};
~Storage()
{
for (int i = 0; i < size; i++)
{
delete arr[i];
}
delete[] arr;
}
void push(T obj, int i)
{
arr[i] = new T(obj);
}
void print()
{
for (int i = 0; i < size; i++)
{
cout << *arr[i];
}
cout << endl;
}


private:
T** arr;
};

template <typename T, int size> void Storage<int,size>::print() //LINE 38 ERROR
{
for (int i = 0; i < size; i++)
{
cout << (char) *arr[i];
}
cout << endl;
}
#endif /* STORAGE_HPP_ */

我得到这个错误:

../Storage.hpp:38:63: error: invalid use of incomplete type
class Storage<int, size>
../Storage.hpp:9:1: error: declaration of ‘class Storage<int, size>’

那么,第一个问题:专门的功能可以在一个类中实现吗?我试过了,但出错了。其次,为什么我会收到我附加的错误?谢谢!

编辑:我尝试了一些新的东西,正如这里有人建议的那样。我已将类(class)内的打印更改为仅 void print()我已经在外部实现了它,所以我可以重载该函数。这里:

template <typename T, int size>
void Storage<T,size>::print()
{
for (int i = 0; i < size; i++)
{
cout << *arr[i];
}
cout << endl;
}


template <typename T, int size>
void Storage<int,size>::print() //ERROR HERE
{
for (int i = 0; i < size; i++)
{
cout << *arr[i];
}
cout << endl;
}

现在我得到 invalid use of incomplete type ‘class Storage<int, size>’我在这里写错误的地方(很明显!)我知道这是一个常见的解决方案,对吗?为什么会出现此错误?

最佳答案

问题是您试图使用整个的部分特化,而没有定义部分特化的类。

如果print如果它本身就是一个函数模板,情况就会不同,因为你确实可以特化函数模板。但是,您的构造只有整个类作为模板。

这意味着template <typename T, int n> class Storage<T, n>template <int n> class Storage<int, n>是完全不同的、不相关的类。因此,您必须首先定义后一个类:

template<int n> class Storage<int, n>
{
// define everything
};

template<int n> void Storage<int, n>::print() { /* implement */ }

考虑偏特化 Storage<int, n>可能是与主模板完全不同的类,并且它可能具有完全不同的成员函数。在您实际定义该类之前,编译器无法知道这一点。


根据 sbi 的评论,这里有一个想法:

//... in the class definition

template<typename S, int m> friend void print_helper(const Storage<S, m> &);
template<int m> friend void print_helper(const Storage<int, m> &);

void print() { print_helper(*this); }

// outside:

template <typename S, int size> void print_helper(const Storage<S, size> & s)
{
// ...
}
template <int size> void print_helper(const Storage<int, size> & s)
{
// ...
}

而不是 friend您还可以制作辅助函数模板 static ,但这可能会增加很多代码膨胀,因为每个类类型将有两个静态函数模板,而不是全局只有两个。

关于c++ - 模板函数特化,C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7517158/

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