问题定义:
使用typedef,map和iterator时,我的问题与模板模板有关。
免责声明:
请接受我的道歉,我是C ++的新手,我的词汇量非常有限,因此我无法用语言准确描述我的问题。我附上了我的代码。我希望它能解释得更多。
我的代码
我有两种类型的函数,set和get:
template<class T>
struct SetFunctionClass
{
typedef boost::function<void(T)> SetFunction;
};
template<class G>
struct GetFunctionClass
{
typedef boost::function<G()> GetFunction;
};
我可以这样访问:
void setX (int i)
{
std::cout<< "Ciao"<< i*2 << std::endl;
}
float getA()
{
return 0.1;
}
...
SetFunctionClass<int>::SetFunction fun = &setX;
GetFunctionClass<float>::GetFunction fun2 = &getA;
...
直到这里一切都或多或少都好,但我希望能够在容器类中插入这样的函数,使用类似于的代码:
FunctionHandler<SetFunctionClass<int>::SetFunction> myIntSetFunctionsHandler ;
FunctionHandler<GetFunctionClass<float>::GetFunction> myFloatGetFunctionsHandler ;
std::string methodName("setX");
myIntSetFunctionsHandler.insert(methodName, fun );
std::string methodName2("getA");
myFloatGetFunctionsHandler.insert(methodName2, fun2 );
这是我的容器类:
template<template <typename > class FunctionClass>
class FunctionHandler
{
private:
typedef std::map<std::string, FunctionClass > Function_Map;
typedef typename std::map<std::string, FunctionClass >::iterator Function_Map_Iter;
Function_Map map;
public:
FunctionHandler(void);
virtual ~FunctionHandler(void);
void insert(std::string name, FunctionClass fun)
{
std::string funName(name);
map.insert(funName, fun);
}
FunctionClass find(const std::string& name)
{
std::auto_ptr<std::string> methodName(name);
Function_Map_Iter iter = map.find(*methodName.get());
if (iter == map.end())
throw std::runtime_error("Inexistent method: " + *methodName.get());
return iter->second;
}
};
我的问题: 我的问题在于我模拟类FunctionHandler的方式:
template<template <typename > class FunctionClass>
许多模板上的编译错误
以及此处的模板参数: 注意:Eclipse不接受此签名
FunctionHandler<SetFunctionClass<int>::SetFunction> myIntSetFunctionsHandler;
问题: 能否请您解释一下如何创建一个模板化的类,其中包含另一个模板的模板???
EDITED
感谢!
答案 0 :(得分:1)
您不需要模板模板参数,但需要类型:
template<typename FunctionClass>
class FunctionHandler;
就够了。
然后您可以将其与
一起使用FunctionHandler<SetFunctionClass<int>::SetFunction> myIntSetFunctionsHandler;
FunctionHandler<GetFunctionClass<float>::GetFunction> myFloatGetFunctionsHandler;
以下
template<template <typename > class FunctionClass> class Foo;
允许调用
Foo<SetFunctionClass> foo; // we don't mention what is the type of SetFunctionClass
答案 1 :(得分:0)
SetFunctionClass<int>
是一种类型,SetFunctionClass<int>::SetFunction
也是。 SetFunctionClass
是template
。
template <typename > class FunctionClass
是模板参数,而不是类型参数。
template
是在填写参数时产生类型的东西。它们不是类型。传递它们时,它们不能在template
中用作类型,它们只能用作template
。
如果你想要一个类型,传入一个类型,并接受一个类型。