C++ 在函数重载中使用标记
为什么X中的方法测试模棱两可,如何解决这个问题C++ 在函数重载中使用标记,c++,generic-programming,C++,Generic Programming,为什么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; } struct A{}; 结构B
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;
}
struct A{};
结构B{};
模板
结构I{void test(T){};
结构X:公共I,I{};
int main(int argc,const char*argv[]
{
X;
x、 测试(A());
返回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]
函数“int main(int,const char**)”中的
错误:成员“测试”的请求不明确
错误:候选项为:void I::test(T)[带T=B]
错误:void I::test(T)[带T=A]
test
不明确,因为它是X
的两个基类的成员。虽然不是两个函数都匹配,但名称匹配
使用显式转发进行修复:
struct X : public I<A>, I<B> {
template <typename T>
void test(T t) { I<T>::test(t); }
};
结构X:public I,I{
模板
无效测试(T){I::测试(T);}
};
因为
X
multiply继承自I
和I
,所以对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;
}
struct A{};
结构B{};
模板
结构I{void test(T){};
结构X:公共I,I{};
int main(int argc,const char*argv[]
{
X;
x、 I::test(A());
返回0;
}
使用:
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;
}
struct A{};
结构B{};
模板
结构I{void test(T){};
结构X:公共I,I
{
使用I::test;
使用I::test;
};
int main(int argc,const char*argv[]
{
X;
x、 测试(A());
返回0;
}
gcc错误
对成员“test”的请求是不明确的
在这里并不是最好的,我们可以更好地理解clang错误的含义:在不同类型的多个基类中找到的成员“test”
您是否认为当前代码是不明确的,并且没有编译,这段代码修复了歧义,但你不喜欢它的风格,什么?@没用,我已经详细阐述了这个问题,以澄清+1是的,这是正确的做法。比我的答案更人性化。@ltn100:谢谢,尽管我更喜欢Plasmah的使用功能。:-)它的可读性稍高一些,但您必须为每个新基类添加一个新的using语句。我不是多重继承的倡导者,但这似乎是OP所追求的功能。thiton的转发方法意味着您要编写10个转发函数,而不是100个使用语句的函数。@无用:OP问题没有明确说明选择哪种解决方案更好;如果真正的问题需要转发更复杂/不寻常的类型,您需要更加小心,至少使用C++11所称的“完美转发”。但即使如此,如果重载采用函数指针,并且您将重载函数传递给测试函数,那么转发也不会帮助您在那里选择与函数参数匹配的重载。