Из template class шаблон. метод без парам. другого class
От: Ruzzz  
Дата: 03.04.17 20:34
Оценка:
Код работает для 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

Вопрос: а как это называется официально? Что это за правило в С++?
Отредактировано 03.04.2017 20:36 Ruzzz . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.