Как принести базовый шаблон тип класса в текущей области, когда совпадают имена типов классов?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как принести базовый шаблон тип класса в текущей области, когда совпадают имена типов классов?

Сообщение Anonymous »

Я делаю статистическое программное обеспечение для управления данными и столкнулся с некоторыми конкретными проблемами GCC. Так что с огромными усилиями мне удалось воссоздать проблему в минимальном примере: < /p>

Код: Выделить всё

// generic statistic with complicated managing logic and single calculation
// funciton. there could be multiple classes like this
template
class statistic {
public:
using value_type = T;
virtual value_type f(int param) = 0;
};

// macro for defining a lot of statistics.
// it could take the name for different statistic class
#define STAT(NAME, TYPE) \
class NAME##_impl: public statistic { \
public: \
using typename statistic::value_type; \
\
value_type f(int param) override; \
} NAME; \

template
class vec {
public:
using value_type = T;

// (error) trying to make statistic follow the vector type
STAT(mult_by_2, value_type);

// this statistic should be int not regarding the vec type
STAT(integer_statistic, int);

value_type vec_data;
};

template
typename vec::mult_by_2_impl::value_type vec::mult_by_2_impl::f(int param) {
// value type in statistic that was brought in current class scope
value_type var = 2*param;
return var;
}

template
typename vec::integer_statistic_impl::value_type vec::integer_statistic_impl::f(int param) {
return 1;
}

int main(int argc, char** argv) {
vec v;
return 0;
}
Этот код прекрасно соответствует Clang ++ с использованием.cpp -std = c ++ 17 , но g ++ с помощью.cpp -std = c ++ 17 Жалений: < /p>

Код: Выделить всё

using.cpp:15:49: error: declaration of ‘using statistic::value_type’ changes meaning of ‘value_type’ [-Wchanges-meaning]
15 |                 using typename statistic::value_type; \
|                                                 ^~~~~~~~~~
using.cpp:26:9: note: in expansion of macro ‘STAT’
26 |         STAT(mult_by_2, value_type);
|         ^~~~
using.cpp:26:25: note: used here to mean ‘using vec::value_type = T’
26 |         STAT(mult_by_2, value_type);
|                         ^~~~~~~~~~
using.cpp:15:42: note: in definition of macro ‘STAT’
15 |                 using typename statistic::value_type; \
|                                          ^~~~
using.cpp:23:15: note: declared here
23 |         using value_type = T;
|               ^~~~~~~~~~
Как я понял, stat (mult_by_2, value_type) расширяется в определение класса с использованием статистики typeName :: value_type в нем. Но первое значение_type от VEC и второго значения_type от статистики . Это довольно сбивает с толку, я знаю.

Подробнее здесь: https://stackoverflow.com/questions/794 ... pe-names-m
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»