我有两个重载 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()
这条路?
最佳答案
好吧,如果 T
是 void
那么你有两个具有完全相同原型(prototype)的函数定义 - 打破了 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)) {}
};
关于c++ - 为什么我收到错误 operator() cannot be overloaded?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14011399/