Здравствуйте, MuTPu4, Вы писали:
MTP>MSVC иммет полное право выдавать ошибку, тут нарушены сразу 2 ограничения на параметры шаблона (14.3.1): MTP>
MTP>A local type, a type with no linkage, an unnamed type or a type compounded from any of these types shall not be used as a template-argument for a template type-parameter.
Первое я вижу — unnamed, а какое второе? static относится к массиву элементов этого типа, а параметр у меня — тип, а не указатель.
И тогда получается, что ошибка есть когда всё работает только с одним безымянным типом (судя по 14.3.1 не должно).
struct X
{
template<typename T>
typename T::Value find(int id, const T* p, size_t s, typename T::Value d)
{
for(size_t i = 0; i < s; ++i, ++p)
if (p->id == id)
return p->value;
return d;
}
};
static const struct// V1
{
typedef int Value;
int id;
int value;
} v1[] = {
{1, 1},
{2, 2}
};
static const struct// V2
{
typedef float Value;
int id;
float value;
} v2[] = {
{1, 1.0f},
{2, 2.0f}
};
int main()
{
X x;
x.find(1, v1, 2, 0); // (1)
// x.find(2, v2, 2, 0.0f); // (2)return 0;
}
Т.е. имеется N (N > 1) безымянных структур, которые очень похожи (отличаются только типом члена value) и некоторая шаблонная функций, которая что-то делает с объектами этих структур.
VC++ 7.1 перестает компилировать код, как только встретит второе использование функции с другим типом структуры. Если убрать комментарии в (2), то выдает ошибку о преобразовании const T[N] в const T* (а если использовать &v2[0], то ошибка будет типа не могу преобразовать const T* в const T* ), но на самом деле он смог определить тип T.
Проблема решается именованием структур, хотя GCC исходный пример нормально проглотил. Вопрос — а кто прав? Нутром чувствую, что MSVC не прав, но стандарта под рукой нет — проверить догадку не могу.
Здравствуйте, Vodka, Вы писали:
V>Проблема решается именованием структур, хотя GCC исходный пример нормально проглотил. Вопрос — а кто прав? Нутром чувствую, что MSVC не прав, но стандарта под рукой нет — проверить догадку не могу.
8.0 первое компилит, второе то же самое выдаёт, могу этот пример на фидбак кинуть ?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vodka, Вы писали:
V>>8.0 первое компилит, второе то же самое выдаёт, могу этот пример на фидбак кинуть ? V>Для фидбека проще этот код, он более короткий, но также не работает.
проще то проще, но не факт что исправив простой пример, сложный будет тоже исправлен. Да и более актуален сложный вариант
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vodka, Вы писали:
V>Проблема решается именованием структур, хотя GCC исходный пример нормально проглотил. Вопрос — а кто прав? Нутром чувствую, что MSVC не прав, но стандарта под рукой нет — проверить догадку не могу.
MSVC иммет полное право выдавать ошибку, тут нарушены сразу 2 ограничения на параметры шаблона (14.3.1):
A local type, a type with no linkage, an unnamed type or a type compounded from any of these types shall not be used as a template-argument for a template type-parameter.
Здравствуйте, <Аноним>, Вы писали:
А>Первое я вижу — unnamed, а какое второе? static относится к массиву элементов этого типа, а параметр у меня — тип, а не указатель. А>И тогда получается, что ошибка есть когда всё работает только с одним безымянным типом (судя по 14.3.1 не должно).
Прошу прощения, это моя ошибка. Нарушено только ограничение на unnamed типы.