Шаблоны и безымянные структуры (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 не прав, но стандарта под рукой нет — проверить догадку не могу.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.