我正在尝试定义一个像任务农场一样的递归结构。在这里,我正在尝试两个操作数,它们可以递归地工作于任意数量的操作数,因为它可以嵌套自己。
template <typename T1, typename T2>
class Farm
{
private:
T1 *task1;
T2 *task2;
public:
// save them so that I can use them when invoking call operator
Farm(T1 *_t1, T2 *_t2): task1(_t1), task2(_t2) { }
void operator()()
{
// invoke call operator, meaning a farm could be a task (arbitrary nesting)
(*task1)();
(*task2)();
}
};
int main()
{
... create two pointer(A *a, B *b...)
Farm(a,b); // error: missing template arguments before ‘(’ token
Farm<A, B>(a,b); // in this works, it works
}
问题在于模板参数的自动检测,在这种情况下不起作用。我做错了什么,我怎样才能实现这个模板参数的隐式检测,通过gcc编译器。
谢谢!
发布于 2011-06-15 22:51:00
通常的解决方法是提供一个返回实际实现的模板函数。例如,在std::make_pair中,标准C++库使用了很多这样的东西。
示例:
template<typename T>
struct foo_t {
...
};
template<typename T>
foo_t<T> foo(T const &f) {
return foo_t<T>(f);
}
这是因为对于函数,编译器可以从参数列表中推断出类型名。
发布于 2011-06-15 22:53:33
您可以为类Farm添加一个基类:
class FarmBase
{
public:
virtual ~FarmBase(){}
virtual void operator()() = 0;
};
template <typename T1, typename T2>
class Farm : public FramBase
{
private:
T1 *task1;
T2 *task2;
public:
// save them so that I can use them when invoking call operator
Farm(T1 *_t1, T2 *_t2): task1(_t1), task2(_t2) { }
virtual ~Farm(){}
virtual void operator()()
{
// invoke call operator, meaning a farm could be a task (arbitrary nesting)
(*task1)();
(*task2)();
}
};
template< typename A, typename B >
FarmBase* Create( A *a, B *b )
{
return new Farm< A, B >( a, b );
}
然后main看起来像这样:
int main()
{
//... create two pointer(A *a, B *b...)
FarmBase *fobj = CreateFarm( a, b );
}
https://stackoverflow.com/questions/6359592
复制相似问题