模板转换运算符撤消对数组

时间:2015-12-02 10:02:03

标签: c++ templates

我正在阅读这个问题以及其他一些内容:Are there cases where a typedef is absolutely necessary?

我写了这段代码:

const int arrayOfInt[10] = {0};

template<typename T, int N> using X = const T (&)[N];

struct foo
{
    template<typename T, int N> operator  X<int,10> () { return arrayOfInt;  }
};

void bar(const int (&) [10]) {}

int main()
{
    bar(foo());
    return 0;
}
c ++ 11的

using功能对我不起作用,在我的课程{{1}中,我也无法在这种情况下考虑如何typedef返回类型}不是模板本身。我需要使用foo关键字和using来查看解决方案。非常感谢SO的人们:)

2 个答案:

答案 0 :(得分:2)

由于X是别名模板,因此您需要明确提供模板参数;他们不会被周围的范围捕获:

struct foo
{
    template<typename T, int N> 
    operator X<T,N>() { return arrayOfInt; }
    //        ^^^^^
};

您无法使用typedef执行此操作,因为没有typedef模板。

答案 1 :(得分:1)

template<typename T, int N> operator  X<int,10> () { return arrayOfInt;  }

模板参数T和N从不使用,因此永远不会推导出来。

修正 Live On Coliru

const int arrayOfInt[10]{0};

template<typename T, int N> using X = T const (&)[N];

struct foo {
    template<typename T, int N> operator  X<T,N> () const { return arrayOfInt;  }
};

void bar(const int (&) [10]) {}

int main()
{
    foo f;
    X<int, 10> v = f;
    bar(foo());
}