为什么编译失败:
template<typename T, int N>
using vec = vector<vec<T, N - 1>>;
template<typename T>
using vec<0> = T;
虽然只是将它嵌套到一个结构中就可以了:
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;
};
如果您可以用更冗长的结构替换它,那么禁止在别名中递归的理由是什么?
最佳答案
What is the rationale for forbidding recursion in aliases if you can just replace it with more verbose construct?
你在那里回答了你自己的问题。你有做你想做的事情的机制。既然别名的定义只是某种事物的简写,为什么要使已经复杂的语法的语言复杂化呢?
您使用结构来实现机制,并使用别名来提供漂亮的类型名称:
template<typename T, int N>
using vec = typename foo<T,N>::vec;
短小精悍,语言语法更简单。
关于C++:为什么禁止递归模板化别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46595520/