英文:
How to declare a template friend class inside other template class?
问题
-
你尝试实现双向链表。你有一个
linked_list
类和一个DListNode
类,用作容器中元素的外壳,你更喜欢将DListNode
作为class
而不是struct
,因为你希望节点字段在外部不可访问,但你还需要在linked_list
类中访问它们,所以你选择将linked_list
声明为DLinstNode
的友元类以提高封装性。 -
问题: 你按计划执行了如下操作:
template <class Dty_>
class DListNode {
public:
// ...
template <class ...> friend class linked_list; // line 168
// template <class ...> friend class linked_list<Dty_, DListNode<Dty_>, std::allocator<Dty_>>; full specialization doesn't work too
protected:
// ...
};
template <
class Ty_,
template <class ...> class List_node_ = DListNode,
class Alloc_ = std::allocator<Ty_>
>
class linked_list { // line 13
// ...
};
-
然后在第13行出现错误:“使用3个模板参数重新声明”
-
完整的错误文本:
C:\Users\averu\github-local\base\ds\list\list.cpp:13:7: error: redeclared with 3 template parameters
13 | class linked_list { // biderectional double linked list
| ^~~~~~~~~~~
In file included from C:\Users\averu\github-local\base\ds\list\iterator.cpp:2,
from C:\Users\averu\github-local\base\ds\list\list.cpp:1:
C:\Users\averu\github-local\base\ds\list\node.cpp:168:39: note: previous declaration 'template<class ...> class linked_list' used 1 template parameter
168 | template <class ...> friend class linked_list;
|
- 问题:
- 如何以正确的方式声明我计划中的内容?
- 是否有更好的方法?
- 有其他建议吗?
从上面的内容中可以看出,你尝试使用可变模板,但它不起作用。也许你需要通过using
声明来正确定义linked_list
类,然后如何执行这个操作?
英文:
-
Hello. I'm trying to implement double linked list. I have a
linked_list
class andDListNode
class as a shell for elements in my container and I preferDListNode
as aclass
rather than as astruct
, because I want node fields to be inaccessible outside, but I also need to get an access to them in alinked_list
class, so instead of making getters and setters I have chosen to makelinked_list
as a friend class forDLinstNode
to improve encapsulation. -
Problem: I did what I planned like this:
template <
class Dty_
>
class DListNode {
public:
// ...
template <class ...> friend class linked_list; // line 168
// template <class ...> friend class linked_list<Dty_, DListNode<Dty_>, std::allocator<Dty_>>; full specialization doesn't work too
protected:
// ...
};
template <
class Ty_,
template <class ...> class List_node_ = DListNode,
class Alloc_ = std::allocator<Ty_>
>
class linked_list { // line 13
// ...
};
-
And got an error in line 13: "redeclared with 3 template parameters"
-
The full error text:
C:\Users\averu\github-local\base\ds\list\list.cpp:13:7: error: redeclared with 3 template parameters
13 | class linked_list { // biderectional double linked list
| ^~~~~~~~~~~
In file included from C:\Users\averu\github-local\base\ds\list\iterator.cpp:2,
from C:\Users\averu\github-local\base\ds\list\list.cpp:1:
C:\Users\averu\github-local\base\ds\list\node.cpp:168:39: note: previous declaration 'template<class ...> class linked_list' used 1 template parameter
168 | template <class ...> friend class linked_list;
|
- Questions:
- How to declare what I planned in a right way?
- Is there any better way to do this?
- Any other recommendations?
As you can see there I'm trying to use variadic template, but it doesn't work. So, perhaps I need to declare class linked_list
forward via using
declaration how then do it?
答案1
得分: 2
你声明的友元类使用了与“linked_list”定义不同的模板参数。你需要像这样声明它为友元:
class DListNode {
public:
template <class, template <class...> class, class> friend class linked_list;
};
因为“linked_list”有一个类模板参数,然后是一个模板模板参数,最后是另一个类参数。
https://godbolt.org/z/hxhP396nv
英文:
You declaration of the friend class uses different template arguments than the definition of linked_list
. You need to declare it as a friend like so:
class DListNode {
public:
template <class, template <class...> class, class> friend class linked_list;
};
becaus linked_list
has one class template argument, followed by a template template argument, followed by another class argument.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论