我正在练习功能专业化,我试图用专门的打印功能创建一个小的存储对象。这里是我的代码:模板功能专业化,C++
#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>’
所以,第一个问题:可以专门的函数类内部实现的?我试过但得到一个错误。 其次,为什么我得到我附加的错误? 谢谢!
编辑:我尝试了一些新的东西,因为这里有人建议。我在课堂上打印的内容只有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>’
我在哪里写了错误的位置 我明白这是一个通用的解决方案,我在正确的(当然!)?为什么我会得到这个错误?
我不知道,你可以做一个偏特 – Seb
其他一切不谈,不应该'模板无效存储 ::打印()'是'模板 void存储 :: print()'? –
Chad
@查德:不,他试图做部分专业化。他想要的是'typename T'被删除。 – PlasmaHH