2

我有一个函数,将一个具有多个参数的模板类作为参数(参见以下代码中的“func2”)。我希望该函数能够将继承自 agument 类型的类作为参数,并通过向上转换自动解析模板类型。在下面的示例中,函数 '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;
}
4

2 回答 2

1

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

不过,您可以使用别名,假设您的编译器支持它们:

template < typename T >
using D = C<T,int>;

我相信这应该与您的功能模板相匹配。

如果您试图让 D 具有不同的行为,那么您将创建 C 的部分特化。

于 2014-10-14T10:01:32.540 回答
0

好的,所以我发现的最佳选择如下。这个想法是让'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;
}
于 2014-10-14T13:55:33.340 回答