Примено следующий код:
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 не прав, но стандарта под рукой нет — проверить догадку не могу.