我有两个重载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);
}
Run Code Online (Sandbox Code Playgroud)
当第一个模板参数这些错误只发生T是void.我想知道我做错了什么以及为什么我不能以operator()这种方式超载?
好吧,如果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)) {}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7171 次 |
| 最近记录: |