Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.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++;函数参数,自动向上转换多个模板化类_C++_Function_Templates_Arguments_Upcasting - Fatal编程技术网

C++ c++;函数参数,自动向上转换多个模板化类

C++ c++;函数参数,自动向上转换多个模板化类,c++,function,templates,arguments,upcasting,C++,Function,Templates,Arguments,Upcasting,我有一个函数,它以一个具有多个参数的模板类作为参数(请参见下面代码中的“func2”)。我希望函数能够将从Agment类型继承的类作为参数,并通过向上转换自动解析模板类型。在下面的示例中,函数“func1”是可以的,但对于函数“func2”,当参数是多模板类时,显然不可能直接实现 错误消息指出:“已忽略候选模板:替换失败:模板参数的模板参数与其对应的模板参数不同” 我理解(并有点同意)这个信息。但“func1”的情况也是如此,而且运行良好 所以我的问题是,有没有一种方法可以在使用函数时通过自动向

我有一个函数,它以一个具有多个参数的模板类作为参数(请参见下面代码中的“func2”)。我希望函数能够将从Agment类型继承的类作为参数,并通过向上转换自动解析模板类型。在下面的示例中,函数“func1”是可以的,但对于函数“func2”,当参数是多模板类时,显然不可能直接实现

错误消息指出:“已忽略候选模板:替换失败:模板参数的模板参数与其对应的模板参数不同” 我理解(并有点同意)这个信息。但“func1”的情况也是如此,而且运行良好

所以我的问题是,有没有一种方法可以在使用函数时通过自动向上转换将变量“d”视为类型“C”?如果是,怎么做? 我使用的是Xcode 5.1.1,clang-503.0.40。和C++11选项。谢谢

template <class T1>
class A {};

class B : public A<int> {};

template <template <class T1> class T, class T1 >
void func1(T<T1> _arg) {}

template <class T1, class T2>
class C {};

template <class T1>
class D : public C<T1,int> {};

template <template <class T1, class T2> class T, class T1, class T2>
void func2(T<T1,T2> _arg) {}


int main() {
    A<int> a;
    B b;
    func1(a);//works
    func1(b);//works, T1 is resolved

    C<float,int> c;
    D<float> d;
    func2(c);//works
    func2(d);//doesn't work,compilation error message: "Candidate template ignored: substitution failure : template template argument has different template parameters than its corresponding template template parameter"

    return 0;
}
模板
A类{};
B类:公共A{};
模板
void func1(T_arg){}
模板
C类{};
模板
D类:公共C{};
模板
void func2(T_arg){}
int main(){
A A;
B B;
func1(a);//有效
func1(b);//有效,T1已解析
C C;
D;
func2(c);//有效
func2(d);//不工作,编译错误消息:“忽略候选模板:替换失败:模板参数的模板参数与其对应的模板参数不同”
返回0;
}

不,没有办法做你想做的事

但是,如果编译器支持别名,则可以使用别名:

template < typename T >
using D = C<T,int>;
模板
使用D=C;
我相信这应该和你的函数模板匹配得很好


如果你想要有不同的行为,那么你应该创建一个C的部分特化。

好的,所以我发现最好的选择如下。这样做的目的是让“D”相信它是一个多模板类,但实际上其中一个模板参数只意味着是一个特定类型(int)。这样,“D2”既有一个模板类,也有两个模板类。定义模板类D时仍然有一个部分专门化,但实际上它只是类D的常规定义

template <class T1, class T2>
class C {};

template <class T1, class T2=int>
class D;

template <class T1>
class D<T1,int> : public C<T1,int> {};

template <typename T1>
using D2 = D<T1>;

template <template <class T1, class T2> class T, class T1, class T2>
void func2(T<T1,T2> _arg) {}

int main()
{
    C<float,int> c;
    D2<float> d;
    func2(c);//works
    func2(d);//works

    //instantiation tests:
    D<float> test1;//works -> normal
    D<float, int> test2;//works -> not ideal but well ok
    D<float, float> test3;//doesn't work -> also normal. States: "Implicit instantiation of undefined template 'D<float, float>' "

    return 0;
}
模板
C类{};
模板
D类;
模板
D类:公共C{};
模板
使用D2=D;
模板
void func2(T_arg){}
int main()
{
C C;
D2 d;
func2(c);//有效
func2(d);//有效
//实例化测试:
D test1;//工作->正常
D test2;//工作->不理想但正常
D test3;//不工作->也正常。状态为:“未定义模板“D”的隐式实例化”
返回0;
}

func1(b)
func1(b)也有错误//工作
clang,但我忘了提到我使用C++11,也许这就是原因。我想你应该一步一步地做:让编译器知道派生类的基类:像这样,然后看看基类是否是T类型(这是我要阻止的部分)是的,这是个好主意。但我想不惜一切代价避免部分专业化。但是typedef方法给了我一个想法。我正在写答案。