Код работает для vc++ в любом случае, а g++ требует указать ключевое слово template, см. комментарий в коде:
#include <iostream>
template <typename ResultInt>
class CalcFor
{
public:
CalcFor() : total_(0) { }
template <typename T>
void next()
{
total_ += sizeof(T);
}
ResultInt total() const { return total_; }
private:
ResultInt total_;
};
template <typename ResultInt, typename... Ts>
class Calc
{
public:
ResultInt total() const
{
CalcFor<ResultInt> e;
int dummy[] = { (e.template next<Ts>(), 0)... }; // Если e.next<Ts>() - g++ выдает ошибку
(void)dummy;
return e.total();
}
};
int main(const int /* argc */, const char* const* /* argv */ )
{
Calc<size_t, int, char> c;
std::cout << c.total() << '\n';
return 0;
}
Вот тут можно запустить
http://ideone.com/BGXBds
g++ ошибка:
/contest/contest.cpp: In member function 'ResultInt Calc<ResultInt, Ts>::total() const':
/contest/contest.cpp:204:35: error: expected primary-expression before '>' token
int dummy[] = { (e.next<Ts>(), 0)... };
^
/contest/contest.cpp:204:37: error: expected primary-expression before ')' token
int dummy[] = { (e.next<Ts>(), 0)... };
^
/contest/contest.cpp:204:42: error: expansion pattern '(((e.next < <expression error>) > <expression error>), 0)' contains no argument packs
int dummy[] = { (e.next<Ts>(), 0)... };
^~~
Прочитал об этом тут
http://ldmitrieva.blogspot.com/2010/11/blog-post.html
Вопрос: а как это называется официально? Что это за правило в С++?