在函数重载中使用标记
Using tags in function overloading
为什么X中的方法测试不明确,如何解决?
struct A{};
struct B{};
template<typename T>
struct I { void test(T){} };
struct X : public I<A>, I<B> {};
int main(int argc, const char *argv[])
{
X x;
x.test(A());
return 0;
}
编译错误:
In function ‘int main(int, const char**)’:
error: request for member ‘test’ is ambiguous
error: candidates are: void I<T>::test(T) [with T = B]
error: void I<T>::test(T) [with T = A]
test
是不明确的,因为它是X
的两个基类的成员。虽然不是两个函数都匹配,但名称匹配。
用显式转发修复:
struct X : public I<A>, I<B> {
template <typename T>
void test(T t) { I<T>::test(t); }
};
使用:
struct A{};
struct B{};
template<typename T>
struct I { void test(T){} };
struct X : public I<A>, I<B>
{
using I<A>::test;
using I<B>::test;
};
int main(int argc, const char *argv[])
{
X x;
x.test(A());
return 0;
}
gcc错误request for member 'test' is ambiguous
在这里并不是最好的,我们可以更好地了解clang的错误意味着什么:member 'test' found in multiple base classes of different types
由于X
乘法继承自I<A>
和I<B>
,因此对test()
的调用不明确。您可以这样做来明确声明您所指的父级:
struct A{};
struct B{};
template<typename T>
struct I { void test(T){} };
struct X : public I<A>, I<B> {};
int main(int argc, const char *argv[])
{
X x;
x.I<A>::test(A());
return 0;
}
相关文章:
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- c++:可变模板和函数重载
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- 解决模板成员函数重载
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 推断模板化函数中的函数重载
- C++复制函数重载导致"must be a nonstatic member function"错误
- 为什么 std::sort 找不到合适的(静态成员)函数重载?
- 可变参数泛型 lambda 和函数重载
- C++中的函数重载和继承
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- C/C++ 可变参数宏函数重载
- 将基类的成员函数重载到其他派生类C++
- C++ 函数重载匹配
- C++函数重载,具体步骤是什么
- C++:使用 param pack 显式调用函数重载
- 隐式生成的函数重载用于右值参数?
- 使用函数重载输入运算符
- 运算符重载函数上的函数重载