Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在函数重载中使用标记_C++_Generic Programming - Fatal编程技术网

C++ 在函数重载中使用标记

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

为什么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{};
模板
结构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所称的“完美转发”。但即使如此,如果重载采用函数指针,并且您将重载函数传递给测试函数,那么转发也不会帮助您在那里选择与函数参数匹配的重载。