Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用派生类调用父类的模板化函数重载_C++_Templates_Inheritance_Overloading - Fatal编程技术网

C++ 使用派生类调用父类的模板化函数重载

C++ 使用派生类调用父类的模板化函数重载,c++,templates,inheritance,overloading,C++,Templates,Inheritance,Overloading,我有以下形式的问题: class A { ... }; template <...> class B : public A { ... } f(A*) {...} f(C*) {...} template <...> f(D*) {...} A类{ ... }; 模板类别B:公共A{ ... } f(A*){…} f(C*){…} 模板f(D*){…} 问题是,如果我使用类型为B*的参数调用函数f,它将选择泛型类型D*(与A或B完全无关)。我希望它为

我有以下形式的问题:

class A {
    ...
};
template <...> class B : public A {
    ...
}

f(A*) {...}
f(C*) {...}
template <...> f(D*) {...}
A类{
...
};
模板类别B:公共A{
...
}
f(A*){…}
f(C*){…}
模板f(D*){…}
问题是,如果我使用类型为B*的参数调用函数f,它将选择泛型类型D*(与A或B完全无关)。我希望它为A*选择专门化

我试图做的事情有效吗?如果有效,为什么无效?
谢谢,
Ian

您可以使用SFINAE:

template<typename T>
typename boost::disable_if<boost::is_base_of<A, T>, Ret>::type
f(T*);
模板
typename boost::禁用_if::type
f(T*);
(如果您想专门为类型
B
禁用此重载,而不仅仅是从
A
派生的所有类型,您可以使用
boost::is__
作为条件。)

您可以使用SFINAE:

template<typename T>
typename boost::disable_if<boost::is_base_of<A, T>, Ret>::type
f(T*);
模板
typename boost::禁用_if::type
f(T*);

(如果您想专门为类型
B
禁用此重载,而不仅仅是从
A
派生的所有类型,您可以使用
boost::is__
作为条件。)

我不确定您想做什么。您可以尝试:

void f(B *b)
{
  f(dynamic_cast<A*>(b));
}
void f(B*B)
{
f(动态_-cast(b));
}

这将使用类型为
B*
的参数调用
f()
,以解析
f()
的第一个定义,该定义接受类型为
a*
的参数。否则,编译器将使用需要最少隐式类型转换的函数解析对
f()
的调用。由于
模板无效f(D*)
不需要类型转换,它将捕获与更具体的定义不匹配的
f()
的所有调用。

我不确定您想做什么。您可以尝试:

void f(B *b)
{
  f(dynamic_cast<A*>(b));
}
void f(B*B)
{
f(动态_-cast(b));
}

这将使用类型为
B*
的参数调用
f()
,以解析
f()
的第一个定义,该定义接受类型为
a*
的参数。否则,编译器将使用需要最少隐式类型转换的函数解析对
f()
的调用。由于
模板无效f(D*)
不需要类型转换,它将捕获与更具体的定义不匹配的
f()
的所有调用。

我想做的似乎不是直接可能的;显然,模板专门化优先于多态性,如果没有Boost或C++11,就不可能解决这一问题

最后,我解决了这个问题,只需在调用“f”之前将所有内容转换为键入“A*”


谢谢大家,

看来我想做的事情不是直接可能的;显然,模板专门化优先于多态性,如果没有Boost或C++11,就不可能解决这一问题

最后,我解决了这个问题,只需在调用“f”之前将所有内容转换为键入“A*”


谢谢大家,

你是说
B*?什么是
C*`?你是说
B*?什么是
C*`?如果您希望所有派生类型的
a
解析为
f(a*)
,这是一个更好的答案。注意,对于C++11,您可以通过使用std::is_base_of避免boost依赖性。“看,我正在努力避免依赖Boost或C++11。@IanMallett Reimplement自己说功能(虽然选择
is_base\u of
可能会太麻烦,但你可以改为使用
is same
)。如果你想将
a
的所有派生类型解析为
f(a*)
,这是一个更好的答案。注意,对于C++11,您可以通过使用std::is_base_of避免boost依赖性。请看,我试图避免依赖Boost或C++11。@IanMallett Reimplement自己说的功能(虽然选择
is_base\u of
可能会太麻烦,但您可以改为使用
is same
)。不幸的是,类型a在库中,而从中派生的类型B是用户定义的类型。函数“f”也应该在库中,我不希望用户必须定义自己的重载。不幸的是,类型A在库中,而从它派生的类型B是用户定义的类型。函数“f”也应该在库中,我不希望用户必须定义自己的重载。