【问题标题】:Template typedef of a template [duplicate]模板的模板类型定义[重复]
【发布时间】:2011-06-27 10:32:12
【问题描述】:

可能重复:
C++ template typedef

我正在尝试通过预先特化另一个模板来派生另一个模板的模板类型:

template<unsigned a, unsigned b, unsigned c>
struct test
{
    enum
    {
        TEST_X = a,
        TEST_Y = b,
        TEST_Z = c,
    };
};

template<unsigned c>
typedef test<0, 1, c> test01;

但是,在 GCC 4.4.5 上,我收到此错误:error: template declaration of ‘typedef’ 第二种类型 (test01)。

非常感谢您的指导,因为我不明白我的代码有什么问题。

【问题讨论】:

  • 我知道这是重复的,但我找不到。编辑:啊哈,here.
  • 请下次使用搜索
  • 当您查看副本时,请注意在这种特殊情况下,用户不想使用继承,即使这是 C++98 编译器的常见模式:template &lt;unsigned c&gt; struct test01 : test&lt;0,1,c&gt; {}略有不同,因为您正在向混合中添加继承并且有一些陷阱(注意:不要通过指向 test&lt;0,1,N&gt; 的指针删除类型,因为这会导致 UB,始终在 test01 级别销毁)

标签: c++ templates


【解决方案1】:

C++03 不允许这种语法。最近的解决方法是:

template<unsigned c>
struct test01
{
    typedef test<0, 1, c> type;
};

typedef test01<2>::type my_type;

在 C++0x 中,我们可以这样做:

template<unsigned c>
using test01 = test<0, 1, c>;

【讨论】:

  • 该死的C++03!!!该死的 C++0x 还没有来!感谢您澄清这一点。
  • 很遗憾,templatetypedef 是非法的。 ;-)
  • @templatetypedef:那你在这里做什么? ;)
  • @templatetypedef :我知道你是非法的;谢谢你承认:P
【解决方案2】:

只是为了列出替代方案:

template <typename C>
struct test01 : test<0, 1, C> { };

test01<4> my_test014;

这确实创建了新的、不同的类型,而不仅仅是基础模板实例化的别名 :-(.

【讨论】:

  • 遗憾的是它没有防范:test&lt;0, 1, 2&gt;* x = new test01&lt;2&gt;(); delete x; // oops, UB!.
  • @GMan:如果您不费心在test&lt;&gt; 中放置virtual 析构函数,这显然是正确的(与从标准容器派生的相同的老问题,实际上与我的经验和编码风格无关,但每个人都生活在对他们来说似乎很重要的担忧中......)
  • 因为我主要做模板元编程,这对我来说很好。但是,我确实理解其中的区别。
  • 不适用于#include template struct MyShared : public std::shared_ptr{};
  • @Cobala:我倾向于在此评论中投入尽可能多的精力和细节,就像您为您的评论所做的那样,我只想说“您错了”,但更具建设性;- P ...这是an ideone example 证明它“有效”,但更严重的是,您可能想要添加一两个便利功能 - 例如至少构造函数在MyShared 内转发ala using std::shared_ptr&lt;T&gt;::shared_ptr;。干杯。
猜你喜欢
  • 2023-03-13
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 2011-09-26
相关资源
最近更新 更多