C++:为什么禁止递归模板化别名?

Dan*_* M. 5 c++ recursion alias templates template-meta-programming

为什么编译失败:

template<typename T, int N>
using vec = vector<vec<T, N - 1>>;
template<typename T>
using vec<0> = T;
Run Code Online (Sandbox Code Playgroud)

而将它嵌套到结构中就可以了:

template<typename T, int N>
struct foo {
    using vec = vector<typename foo<T, N - 1>::vec>;
};
template<typename T>
struct foo<T, 0> {
    using vec = T;
};
Run Code Online (Sandbox Code Playgroud)

如果您可以用更详细的构造替换它,那么禁止别名中的递归的理由是什么?

参见: https: //godbolt.org/g/YtyhvL

Sto*_*ica 3

如果您可以用更详细的构造替换它,那么禁止别名中的递归的理由是什么?

你在那里回答了你自己的问题。你有做你想做的事情的机制。既然根据定义,别名只是某种东西的简写,为什么还要让已经很复杂的语法变得复杂呢?

您可以使用结构来实现机制,并使用别名来提供漂亮的类型名称:

template<typename T, int N>
using vec = typename foo<T,N>::vec;
Run Code Online (Sandbox Code Playgroud)

简短而甜蜜,语言语法更简单。