Adding STL iterator support to custom collection class — followup
$begingroup$
I read the excellent answer to the question Example of adding STL iterator support to custom collection class on this site; but would like furthermore the iterator class to be a nested class (because of shared types). The skeleton I want is:
template <typename T, std::size_t Capacity> class RingQueue
{
...
template <typename TT> class RingIter { ... operations ++, --, ... }
public:
using iterator = RingIter<T>;
using const_iterator = RingIter<const T>;
using reverse_iterator = std::reverse_iterator<iterator>;
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
... define begin(), end(), ...
};
// this is the line that doesn't compile!
template<typename T, std::size_t Capacity, typename TT> class std::iterator_traits<RingQueue<T,Capacity>::RingIter<TT>>
{
public:
using difference_type = std::ptrdiff_t;
using size_type = std::size_t;
using value_type = TT;
using pointer = TT*;
using reference = TT&;
using iterator_category = std::random_access_iterator_tag;
};
and it's in this last part that I'm stuck -- whatever I tried, I can't get to extend std::iterator_traits correctly.
c++ c++11 iterator collections
New contributor
$endgroup$
add a comment |
$begingroup$
I read the excellent answer to the question Example of adding STL iterator support to custom collection class on this site; but would like furthermore the iterator class to be a nested class (because of shared types). The skeleton I want is:
template <typename T, std::size_t Capacity> class RingQueue
{
...
template <typename TT> class RingIter { ... operations ++, --, ... }
public:
using iterator = RingIter<T>;
using const_iterator = RingIter<const T>;
using reverse_iterator = std::reverse_iterator<iterator>;
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
... define begin(), end(), ...
};
// this is the line that doesn't compile!
template<typename T, std::size_t Capacity, typename TT> class std::iterator_traits<RingQueue<T,Capacity>::RingIter<TT>>
{
public:
using difference_type = std::ptrdiff_t;
using size_type = std::size_t;
using value_type = TT;
using pointer = TT*;
using reference = TT&;
using iterator_category = std::random_access_iterator_tag;
};
and it's in this last part that I'm stuck -- whatever I tried, I can't get to extend std::iterator_traits correctly.
c++ c++11 iterator collections
New contributor
$endgroup$
2
$begingroup$
We only review working code. We don't help people implement features. Also, it isn't a follow-up if you weren't the author of the original post.
$endgroup$
– bruglesco
2 hours ago
$begingroup$
Also, your bug could be as simple as the fact that you forgot thetypename
keyword beforeRingQueue<T,Capacity>::
and thetemplate
keyword beforeRingIter<TT>
. (Have you watched "Template Normal Programming"?)
$endgroup$
– Quuxplusone
51 mins ago
add a comment |
$begingroup$
I read the excellent answer to the question Example of adding STL iterator support to custom collection class on this site; but would like furthermore the iterator class to be a nested class (because of shared types). The skeleton I want is:
template <typename T, std::size_t Capacity> class RingQueue
{
...
template <typename TT> class RingIter { ... operations ++, --, ... }
public:
using iterator = RingIter<T>;
using const_iterator = RingIter<const T>;
using reverse_iterator = std::reverse_iterator<iterator>;
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
... define begin(), end(), ...
};
// this is the line that doesn't compile!
template<typename T, std::size_t Capacity, typename TT> class std::iterator_traits<RingQueue<T,Capacity>::RingIter<TT>>
{
public:
using difference_type = std::ptrdiff_t;
using size_type = std::size_t;
using value_type = TT;
using pointer = TT*;
using reference = TT&;
using iterator_category = std::random_access_iterator_tag;
};
and it's in this last part that I'm stuck -- whatever I tried, I can't get to extend std::iterator_traits correctly.
c++ c++11 iterator collections
New contributor
$endgroup$
I read the excellent answer to the question Example of adding STL iterator support to custom collection class on this site; but would like furthermore the iterator class to be a nested class (because of shared types). The skeleton I want is:
template <typename T, std::size_t Capacity> class RingQueue
{
...
template <typename TT> class RingIter { ... operations ++, --, ... }
public:
using iterator = RingIter<T>;
using const_iterator = RingIter<const T>;
using reverse_iterator = std::reverse_iterator<iterator>;
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
... define begin(), end(), ...
};
// this is the line that doesn't compile!
template<typename T, std::size_t Capacity, typename TT> class std::iterator_traits<RingQueue<T,Capacity>::RingIter<TT>>
{
public:
using difference_type = std::ptrdiff_t;
using size_type = std::size_t;
using value_type = TT;
using pointer = TT*;
using reference = TT&;
using iterator_category = std::random_access_iterator_tag;
};
and it's in this last part that I'm stuck -- whatever I tried, I can't get to extend std::iterator_traits correctly.
c++ c++11 iterator collections
c++ c++11 iterator collections
New contributor
New contributor
New contributor
asked 3 hours ago
grokgrok
991
991
New contributor
New contributor
2
$begingroup$
We only review working code. We don't help people implement features. Also, it isn't a follow-up if you weren't the author of the original post.
$endgroup$
– bruglesco
2 hours ago
$begingroup$
Also, your bug could be as simple as the fact that you forgot thetypename
keyword beforeRingQueue<T,Capacity>::
and thetemplate
keyword beforeRingIter<TT>
. (Have you watched "Template Normal Programming"?)
$endgroup$
– Quuxplusone
51 mins ago
add a comment |
2
$begingroup$
We only review working code. We don't help people implement features. Also, it isn't a follow-up if you weren't the author of the original post.
$endgroup$
– bruglesco
2 hours ago
$begingroup$
Also, your bug could be as simple as the fact that you forgot thetypename
keyword beforeRingQueue<T,Capacity>::
and thetemplate
keyword beforeRingIter<TT>
. (Have you watched "Template Normal Programming"?)
$endgroup$
– Quuxplusone
51 mins ago
2
2
$begingroup$
We only review working code. We don't help people implement features. Also, it isn't a follow-up if you weren't the author of the original post.
$endgroup$
– bruglesco
2 hours ago
$begingroup$
We only review working code. We don't help people implement features. Also, it isn't a follow-up if you weren't the author of the original post.
$endgroup$
– bruglesco
2 hours ago
$begingroup$
Also, your bug could be as simple as the fact that you forgot the
typename
keyword before RingQueue<T,Capacity>::
and the template
keyword before RingIter<TT>
. (Have you watched "Template Normal Programming"?)$endgroup$
– Quuxplusone
51 mins ago
$begingroup$
Also, your bug could be as simple as the fact that you forgot the
typename
keyword before RingQueue<T,Capacity>::
and the template
keyword before RingIter<TT>
. (Have you watched "Template Normal Programming"?)$endgroup$
– Quuxplusone
51 mins ago
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
});
});
}, "mathjax-editing");
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "196"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
grok is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f214210%2fadding-stl-iterator-support-to-custom-collection-class-followup%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
grok is a new contributor. Be nice, and check out our Code of Conduct.
grok is a new contributor. Be nice, and check out our Code of Conduct.
grok is a new contributor. Be nice, and check out our Code of Conduct.
grok is a new contributor. Be nice, and check out our Code of Conduct.
Thanks for contributing an answer to Code Review Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f214210%2fadding-stl-iterator-support-to-custom-collection-class-followup%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
2
$begingroup$
We only review working code. We don't help people implement features. Also, it isn't a follow-up if you weren't the author of the original post.
$endgroup$
– bruglesco
2 hours ago
$begingroup$
Also, your bug could be as simple as the fact that you forgot the
typename
keyword beforeRingQueue<T,Capacity>::
and thetemplate
keyword beforeRingIter<TT>
. (Have you watched "Template Normal Programming"?)$endgroup$
– Quuxplusone
51 mins ago