Шаблоны и безымянные структуры (MSVC 7.1)
От: Vodka  
Дата: 21.08.06 11:40
Оценка:
Примено следующий код:

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 не прав, но стандарта под рукой нет — проверить догадку не могу.
Re: Шаблоны и безымянные структуры (MSVC 7.1)
От: Vain Россия google.ru
Дата: 21.08.06 12:51
Оценка:
Здравствуйте, Vodka, Вы писали:

V>Проблема решается именованием структур, хотя GCC исходный пример нормально проглотил. Вопрос — а кто прав? Нутром чувствую, что MSVC не прав, но стандарта под рукой нет — проверить догадку не могу.

8.0 первое компилит, второе то же самое выдаёт, могу этот пример на фидбак кинуть ?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[2]: Шаблоны и безымянные структуры (MSVC 7.1)
От: Vodka  
Дата: 21.08.06 13:22
Оценка:
Здравствуйте, Vain, Вы писали:

V>Здравствуйте, Vodka, Вы писали:


V>8.0 первое компилит, второе то же самое выдаёт, могу этот пример на фидбак кинуть ?


Для фидбека проще этот код, он более короткий, но также не работает.


struct X
{
    template<typename T>
    void f(const T* p)
    {
         p->v;
    }
};


static const struct // V1
{
    int v;
} v1[] = {
    {1}
};

static const struct // V2
{
    float v;
} v2[] = {
    {1.0f}
};

int main()
{
    X x;
    
    x.f(v1);    // (1)
//    x.f(v2);    // (2)
}
Re[3]: Шаблоны и безымянные структуры (MSVC 7.1)
От: Vain Россия google.ru
Дата: 21.08.06 13:49
Оценка:
Здравствуйте, Vodka, Вы писали:

V>>8.0 первое компилит, второе то же самое выдаёт, могу этот пример на фидбак кинуть ?

V>Для фидбека проще этот код, он более короткий, но также не работает.
проще то проще, но не факт что исправив простой пример, сложный будет тоже исправлен. Да и более актуален сложный вариант
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: Шаблоны и безымянные структуры (MSVC 7.1)
От: MuTPu4  
Дата: 22.08.06 01:13
Оценка:
Здравствуйте, 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.

Re[2]: Шаблоны и безымянные структуры (MSVC 7.1)
От: Аноним  
Дата: 22.08.06 07:28
Оценка: 3 (1)
Здравствуйте, 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 не должно).
Re[3]: Шаблоны и безымянные структуры (MSVC 7.1)
От: MuTPu4  
Дата: 22.08.06 10:47
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Первое я вижу — unnamed, а какое второе? static относится к массиву элементов этого типа, а параметр у меня — тип, а не указатель.

А>И тогда получается, что ошибка есть когда всё работает только с одним безымянным типом (судя по 14.3.1 не должно).
Прошу прощения, это моя ошибка. Нарушено только ограничение на unnamed типы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.