Can I create a template object A <B> containing an object of type A <B> objects?

I would like to understand if the following code is correct at all or not:

#include <deque> template<class T> struct Node { std::deque<Node<T> > branches; T data; Node(const T& _data) : data(_data) { } }; void dummy() { Node<float> test(5.0f); } 

This code has been compiled with several toolchains without error (see here ). The problem is that now I get an error creating the instance (possibly due to the fact that I'm using llvm lib ++, not sure about the version).

 <...>llvm-libc++/include/deque:912:55: error: invalid application of 'sizeof' to incomplete type 'std::__1::__deque_base<Node<float>, std::__ 1::allocator<Node<float> > >::value_type {aka Node<float>}' static const difference_type __block_size = sizeof(value_type) < 256 ? 4096 / sizeof(value_type) : 16; 

In case this code is correct, I am not interested in investigating the origin of the error (implementation of the compiler or std library) or have a workaround: again, I would like to first of all understand if the code above is formally correct.

+8
c ++ llvm
source share
2 answers

The code is poorly formed. At this stage:

 template<class T> struct Node { std::deque<Node<T> > branches; // <== 

Node<T> is still an incomplete type. There are currently built-in exceptions for incomplete types for three containers:

  • "An incomplete type T can be used when instantiating forward_list if the dispenser satisfies the distribution requirements for completeness 17.6.3.5.1. T must be complete before any member of the obtained specialization from forward_list . [Forwardlist.overview] / 4
  • "An incomplete type T can be used when instantiating a list if the dispenser satisfies the completeness of the dispenser of requirement 17.6.3.5.1. T must be complete before any member of the resulting specialization list is referenced." [list.overview] / 3
  • "An incomplete type T can be used when creating a vector instance if the dispenser satisfies the dispenser completeness of requirement 17.6.3.5.1. T must be completed before any member of the received vector specialization is referenced." [Vector.overview] / 3

There is no wording for deque that currently requires the full type. It seems inappropriate for me to allow incomplete types for vector , but not deque , but the way it is.

+16
source share

This is not a bug in your compiler or standard library. The program is poorly formed. You cannot create an instance of std::deque with an incomplete value type.

+2
source share

All Articles