【发布时间】:2022-01-09 04:18:31
【问题描述】:
我正在尝试创建自定义容器,并将它们用作模板类中的返回类型。 我必须使用 C++98,所以想知道如何编译以下内容:
#include <string>
#include <vector>
/// Make a container called Vector<T>
template<typename T>
struct Vector
{
typedef std::vector<T> type;
};
/// Some ordinary class that holds that data.
class Data
{
public:
Data();
template<typename T>
typename Vector<T>::type* getVec();
/// Specialization
template<>
typename Vector<int>::type* getVec();
};
编译器的错误是:
error: no function template matches function template specialization 'getVec'
为什么 getVec() 的“int”特化不起作用?
【问题讨论】:
-
在不相关的注释中,您几乎应该从不使用指向容器的指针。您尝试使用
getVec()之类的函数解决的潜在问题是什么?为什么需要返回一个指针?您尝试使用Vector结构模板及其type成员类型别名解决什么问题? -
我正在尝试为 typedef map
Table 之类的东西创建一个别名,而不会出现尝试读取包含容器的容器所带来的所有混乱。即 MyRecord 也可以是 std::map ,但 map > 读起来不太好... -
堆上有容器有问题吗?我正在尝试制作一些类似工厂的方法,它只是将大量数据复制到一个方便的容器中,但不对此负责。
-
通常在堆上分配并自己手动和显式地处理动态内存是一个相当大的错误来源,其中一些在过去导致了重大的安全漏洞。编译器非常擅长eliding 复制(在某些情况下这是强制性的),因此按值返回向量通常无论如何都会更有效且更安全。如果编译器在某些情况下无法避免复制,那么它也许可以移动(或者您可以明确地
std::move它)。 -
此外,通过使用指针,您必须在每次要使用
[]运算符时对其进行引用。通过使用对象和引用(如果可能),您每次想要访问向量中的元素时都可以省去编写三个特殊字符的麻烦。