我尝试为模板创建别名,而不是类型,我无法找到执行此操作的语法。下面是一个演示我的问题的示例。我的猜测是,这只是无法完成的事情,但我希望有人可以证明我是错的。如果不能这样做,是否有一些潜在的原因导致这样做没有意义,或者它是否只是没有实现?
template <class S>
class Down;
template <class S>
class Up {
template <class S1>
using Opposite = Down<S1>;
};
template <class S>
class Down {
template <class S1>
using Opposite = Up<S1>;
};
template <template <typename> class Direction>
void oneDirection() {
//Call another function here that uses the template argument as a template
}
template <template <typename> class Direction>
void bothDirections() {
oneDirection<Direction>();
oneDirection<Direction::Opposite>(); //This doesn't compile
}
int main() {
bothDirections<Up>();
}
答案 0 :(得分:3)
在Direction::Opposite
中,Direction::
是嵌套名称说明符,它确实无法表示类模板(您需要给它提供所需的模板参数,使其成为模板特化)。
我认为不允许该形式的一个原因是类模板可以具有部分或显式特化,这可以提供与主模板不同的成员,因此编译器需要使用特定的特化才能够确切地知道什么和#39;在那里可用。
您可以通过使用特征来关联这两个模板来解决这个问题:
template<class> class Up { };
template<class> class Down { };
template<template<class> class Direction> struct Direction_traits;
template<> struct Direction_traits<Up>
{
template<class S1> using Opposite = Down<S1>;
};
template<> struct Direction_traits<Down>
{
template<class S1> using Opposite = Up<S1>;
};
template<template<class> class Direction>
void oneDirection() {
//Do something here
}
template<template<class> class Direction>
void bothDirections() {
oneDirection<Direction>();
oneDirection<Direction_traits<Direction>::template Opposite>();
}
int main() {
bothDirections<Up>();
}
但是,请注意,Direction_traits<Up>::Opposite
与Down
不是同一个模板,至少现在还没有 - 语言规则将来可能会发生变化,this answer及其更多细节评价。
如果您想使用特征从Up
内部返回oneDirection<Direction_traits<Up>::Opposite>
,这可能会导致问题 - 不会为别名模板定义特征专长。要允许这样的使用,事情需要更复杂一些;在上面引用的答案中概述了一种可能的解决方案。