我在使用两个模板参数调用模板函数时遇到问题。
我有一个类,该类接受两种不同类型的对象。我还不知道类型,所以我把它们留作模板参数。然后我将对象存储在包装类中。最后,我希望能够使用两个模板参数调用模板化函数,这需要我的两个对象。但我很困惑如何做到这一点。
以下是解释我问题的代码的精简版本。
template<typename A, typename B>
void someTemplateFunction(A a, B b);
class Problem
{
private:
class WrapperA
{
public:
virtual void doSomething() = 0;
};
template<typename A>
class ConcreteWrapperA : public wrapperA
{
private:
A a;
public:
ConcreteWrapperB(A b_) : a(a_) {}
virtual void doSomething();
};
class WrapperB
{
public:
virtual void doSomething() = 0;
};
template<typename B>
class ConcreteWrapperB : public wrapperB
{
private:
B b;
public:
ConcreteWrapperB(B b_) : b(b_) {}
virtual void doSomething();
};
WrapperA *a;
WrapperB *b;
public:
template<typename A>
void setA(A a)
{
a = new ConcreteWrapperA<A>(a);
}
template<typename B>
void setB(B b)
{
a = new ConcreteWrapperB<B>(b);
}
void call_someTemplateFunction(); // ??????? How do i do this?
};
答案 0 :(得分:2)
问题在于,您已经分别对A
和B
这两种类型进行了类型删除,因此在代码的转换中无处可见A
和{{1}这两种类型已知。
如果您可以编写单个函数B
,那么您可以在该点捕获对类型template<typename A, typename B> void set(A, B)
。
或者,<A, B>
是否可以在不同时知道someTemplateFunction
和A
这两种类型的情况下进行操作?
这是将C ++设计为单程独立编译语言的基本问题。
假设您的程序有三个编译单元; B
使用A.cpp
,setA
种类型T[A]
调用B.cpp
来调用另一种类型setB
和T[B]
拥有C.cpp
对象并想要致电Problem
。编译时没有时间编译器知道someTemplateFunction
中的类型范围和<{em} A.cpp
中的类型范围,因此无法实例化{{1}使用适当的交叉产品B.cpp
。