mardi 10 mars 2015

Template syntax error with end of recursion case

Can someone tell me what is wrong with the syntax for the end of recursion specialization below? I thought I was following all the rules.



#include <iostream>

template <typename StreamType = std::ostream, StreamType& stream = std::cout>
class StringList {
template <typename...> class AddStrings;
public:
template <typename... Args> void addStrings (Args&&... args) {AddStrings<Args...>()(args...);}
};

template <typename StreamType, StreamType& stream>
template <typename First, typename... Rest>
class StringList<StreamType, stream>::AddStrings<First, Rest...> : AddStrings<Rest...> {
public:
void operator()(First&& first, Rest&&... rest) {
// do whatever
AddStrings<Rest...>::operator()(std::forward<Rest>(rest)...);
}
};

template <typename StreamType, StreamType& stream>
template <>
class StringList<StreamType, stream>::AddStrings<> {
friend class StringStreamList;
void operator()() const {} // End of recursion.
};

int main() {
StringList<> stringList;
// stringList.addStrings ("dog", "cat", "bird");
}


I don't understand the error message:



Test.cpp:22:11: error: invalid explicit specialization before '>' token
template <>
^
Test.cpp:22:11: error: enclosing class templates are not explicitly specialized
Test.cpp:23:39: error: template parameters not used in partial specialization:
class StringList<StreamType, stream>::AddStrings<> {
^
Test.cpp:23:39: error: 'StreamType'
Test.cpp:23:39: error: 'stream'

Aucun commentaire:

Enregistrer un commentaire