CRTP 的部分模板专用化问题

Problem with partial template specialization with CRTP

提问人:ritter 提问时间:11/11/2023 最后编辑:Evgritter 更新时间:11/11/2023 访问量:66

问:

我无法弄清楚如何部分专用化使用奇怪的重复模板模式 (CRTP) 的基类。此 CRTP 的特点是派生类本身是一个类模板。这是我尝试的:

#include "iostream"
using namespace std;

template<class T> class Word;

template<class T, template<class> class C>
class BaseView
{
public:
  BaseView() { cout << "normal BaseView" << endl; }
};


#if 0
template<class T, template<class> class C >
class BaseView<Word<T> , C<Word<T> > >
{
public:
  BaseView() { cout << "BaseView specialized on Word" << endl; }
};
#endif


template<class T> class A: public BaseView<T,A>
{
public:
  A():BaseView<T,A>() {}
};





int main()
{
  A<A<Word<int> > > a0;
  A<Word<int> > a1;
}

我希望第二个对象 (a1) 的构造使用(部分)专用基类(在上面的代码中是 ifdef'd 的基类)。

GCC++ v12 告诉我,对于模板参数列表中的第二个参数,它需要一个类模板,得到“C<Word >。这是有道理的,但我不知道如何更改代码以使其工作。

C++ 模板 CRTP

评论

0赞 user4581301 11/11/2023
这里没有编译器错误:godbolt.org/z/oqG7fK4v6 您可能需要完全重现您看到的错误消息,而不是对其进行释义。
0赞 tbxfreeware 11/11/2023
@user4581301:在你的链接中,你保留了.更改它以重现 OP 的错误。#if 0#if 1
1赞 user4581301 11/11/2023
@tbxfreeware 我从来没有想过有些人会发布他们的示例代码的“工作”版本。似乎有点适得其反。
2赞 Evg 11/11/2023
为什么不能使用?template<class T, template<class> class C> class BaseView<Word<T>, C>
1赞 JaMiT 11/11/2023
@WeijunZhou “我从你的代码中看不出这样的需要”——这是适当简化为最小可重现示例的结果。当问题是关于如何指定模板参数时,我们不需要看到如何使用模板参数。请不要鼓励人们将他们的示例代码复杂到超出演示问题所需的程度。

答: 暂无答案