【发布时间】:2018-02-04 17:05:53
【问题描述】:
我有一些非常简单的代码,如下所示:
template <typename T, const T DEFAULT>
class One
{
T *p;
};
template <typename T, const T DEFAULT>
class Two
{
One<One<T, DEFAULT>, DEFAULT> *p;
};
当我尝试编译它时,我收到一条错误消息:
错误:'class One' 不是模板非类型参数的有效类型
但是,当我将 const T DEFAULT 更改为 typename T2 并将 DEFAULT 更改为 T2 时,它开始工作:
template <typename T, typename T2>
class One
{
T *p;
};
template <typename T, typename T2>
class Two
{
One<One<T, T2>, T2> *p;
};
但是,这不是我想要的。我需要我的第一个代码变体,但我不知道它有什么问题以及如何修复它。
【问题讨论】:
-
只有像
int或bool这样的原始类型可以用作非类型模板参数。改为为One提供专业化。 -
好吧,正如编译器告诉你的那样,你不能将
One<T, DEFAULT>类型用于非类型模板参数。您的第二个示例完全不同,因为它使用类型参数而不是非类型参数。 -
除了
One<T, DEFAULT>不是非类型模板参数的有效类型之外,还有DEFAULT不是 类型为One<T, DEFAULT>的问题(如@ 987654335@ 需要)。这闻起来像 X/Y 问题。
标签: c++