 <p>The type is incomplete, like it says. This is not legal (intrusive containers need to know the implementation details - bases, size etc. - at instantiation time).</p> <p>The documentation specifically mentions that you should avoid deducing hook types when you do this kind of 'nested' use.</p> <p>Given this, there are several ways to fix it:</p> <ol> <li><p>You could just shuffle things around: <strong><a href="http://coliru.stacked-crooked.com/a/d32fc155b70a8889" rel="nofollow">Live On Coliru</a></strong>.</p></li> <li><p>If you really would like <code>InputBufferSglList</code> to be a global typedef, of course, you can just alias it: <strong><a href="http://coliru.stacked-crooked.com/a/d0f70d45810bc94e" rel="nofollow">Live On Coliru</a></strong></p></li> <li><p><strong>UPDATE</strong> To the comment, it seems you're really insisting on making this a forward-declared list type, and you can, as described here <a href="http://www.boost.org/doc/libs/1_57_0/doc/html/intrusive/recursive.html" rel="nofollow">in the documentation</a>:</p> <pre><code>typedef boost::intrusive::slist_base_hook&lt;&gt; InputBufferSglHook; class InputBufferSglNode; // list typedef boost::intrusive::slist&lt; InputBufferSglNode, boost::intrusive::base_hook&lt;InputBufferSglHook&gt;, boost::intrusive::cache_last&lt;true&gt; &gt; InputBufferSglList; typedef InputBufferSglList::iterator InputBufferSglIterator; </code></pre> <p>Job Done. See it <strong><a href="http://coliru.stacked-crooked.com/a/4e4b79fa1acef65e" rel="nofollow">Live On Coliru</a></strong> too.</p></li> </ol> <h3>Full Demo</h3> <p>The third version in full, for future reference:</p> <pre><code>#include &lt;boost/intrusive/slist.hpp&gt; typedef boost::intrusive::slist_base_hook&lt;&gt; InputBufferSglHook; class InputBufferSglNode; // list typedef boost::intrusive::slist&lt; InputBufferSglNode, boost::intrusive::base_hook&lt;InputBufferSglHook&gt;, boost::intrusive::cache_last&lt;true&gt; &gt; InputBufferSglList; typedef InputBufferSglList::iterator InputBufferSglIterator; class InputBufferSglNode : public InputBufferSglHook { public: InputBufferSglNode(const void* buffer, size_t size); ~InputBufferSglNode() {}; // copy 'size_t' bytes from list to target, if list doesn't have enough space, method shall return false static bool copy_buffer_from_list(InputBufferSglList &amp;list, InputBufferSglIterator &amp;iter, size_t &amp;offset_in_node, const InputBufferSglIterator&amp; end, uint8_t *target, size_t size); void reset(); public: const void *m_buffer; size_t m_size; }; // empty list const InputBufferSglList s_EMPTY_INPUT_BUFF_SGL = InputBufferSglList(); InputBufferSglNode::InputBufferSglNode(const void* buffer, size_t size) : InputBufferSglHook(), m_buffer(buffer), m_size(size) { // empty } void InputBufferSglNode::reset() { m_buffer = nullptr; m_size = 0; } bool InputBufferSglNode::copy_buffer_from_list(InputBufferSglList &amp;list, InputBufferSglIterator &amp;iter, size_t &amp;offset_in_node, const InputBufferSglIterator&amp; end, uint8_t *target, size_t size) { // implementation } int main() { } </code></pre>