我有两个operator()
重载,一个采用函数引用,它将任何类型作为参数并返回任何类型。另一个采用函数引用,它将任何类型作为参数但返回void
。在我的课程实例化后,我得到以下错误:
In instantiation of 'A<void, int>':
error: 'void A<T, F>::operator()(void (&)(F)) [with T = void, F = int]' cannot be overloaded
error: with 'void A<T, F>::operator()(T (&)(F)) [with T = void, F = int]'
template <typename T, typename F> struct A {
void operator()(T (&)(F)) {}
void operator()(void (&)(F)) {}
};
void f(int) {}
int main() {
A<void, int> a;
a(f);
}
仅当第一个模板参数T
为void
时才会出现这些错误。我想知道我做错了什么以及为什么我不能以这种方式重载operator()
?
答案 0 :(得分:7)
好吧,如果T
是void
,那么你有两个完全相同原型的函数定义 - 打破ODR。
尝试专门化您的结构以防止这种情况:
template <typename T, typename F> struct A {
void operator()(T (&)(F)) {}
void operator()(void (&)(F)) {}
};
template <typename F> struct A<void, F> {
void operator()(void (&)(F)) {}
};