我已经为set定义了一个具有指针对象的删除器,但是当我以下面的方式定义它不起作用时,在函数'int main()':41:43: error: missing template arguments using '(‘’token In file included from /usr/include/c++/4.9/set:那就是我使用Deleter的地方
template <typename T>
struct Deleter
{
void operator () (T *ptr)
{
delete ptr;
}
};
但是,当我更改模板声明的位置时,如下所示,它开始工作。
struct Deleter1
{
template <typename T>
void operator () (T *ptr)
{
delete ptr;
}
};
有谁能解释一下到底有什么不同。因为当我们声明一个有模板变量的类,或者甚至有模板参数的函数时,我们在类定义之前声明模板声明。
发布于 2016-04-17 21:41:32
当您使用函数模板时,编译器通常可以从函数的调用方式判断出模板参数必须是什么。所以在这样的调用中
Deleter1 d1;
int *ip = new int;
d1(ip);
编译器推断T
为int
。
对于使用第一个代码的相应代码,您可以编写
Deleter d;
int *ip = new int;
d(ip);
请注意,在定义d
时,编译器无法知道将使用int*
调用d()
。
发布于 2016-04-17 21:43:19
谁能解释一下到底有什么不同
第一个是类模板。模板的实例是具有成员函数的类。
int* silly_int = new int;
float* silly_float = new float;
Deleter<int> d; // Deleter<int> is a class
d(silly_int); // it can delete int pointers using the member function
Deleter<float> d2; // Deleter<float> is another class
d2(silly_float); // it can delete float pointers
第二个是具有成员函数模板的类。模板的实例是成员函数。
Deleter1 d3; // Deleter1 is a class
d3(silly_int); // it too can delete int pointers
d3(silly_float); // and pointers of other types as well
// using different instance of the member function template
发布于 2016-04-17 21:50:12
对于您的第一个类型Deleter
,您可以创建接受固定类型的对象。
// del_int only accepts int pointers
Deleter<int> del_int;
// del_string only accepts std::string pointers
Deleter<std::string> del_string;
int* ip = new int;
std::string* sp = new std::string;
del_int(ip); // ok
del_string(sp); // ok
del_int(sp); // error
del_string(ip) // error
但是使用Deleter1
,您可以创建单个对象,它将接受任何指针,因为它的成员operator()
是模板化的。
// del_any will accept any kind of pointer
Deleter1 del_any;
int* ip = new int;
std::string* sp = new std::string;
del_any(ip); // ok
del_any(sp); // ok
https://stackoverflow.com/questions/36682445
复制