Przeprowadzamy migrację do Sun Studio 12.1 iz nowym kompilatorem [CC: Sun C++ 5.10 SunOS_sparc 2009/06/03]. Występuje błąd kompilacji podczas kompilowania kodu, który kompilował się dobrze z wcześniejszą wersją Sun Compiler [CC: Sun WorkShop 6 update 2 C++ 5.3 2001/05/15].Błąd kompilacji szablonu w Sun Studio 12
To jest błąd kompilacji, który dostaję.
"Sample.cc": Error: Could not find a match for LoopThrough(int[2]) needed in main(). 1 Error(s) detected. *** Error code 1.
KOD:
#include <iostream>
#define PRINT_TRACE(STR) \
std::cout << __FILE__ << ":" << __LINE__ << ":" << STR << "\n";
template<size_t SZ>
void LoopThrough(const int(&Item)[SZ])
{
PRINT_TRACE("Specialized version");
for (size_t index = 0; index < SZ; ++index)
{
std::cout << Item[index] << "\n";
}
}
/*
template<typename Type, size_t SZ>
void LoopThrough(const Type(&Item)[SZ])
{
PRINT_TRACE("Generic version");
}
*/
int main()
{
{
int arr[] = { 1, 2 };
LoopThrough(arr);
}
}
Gdybym odkomentowaniu kod z wersji Generic, kod kompiluje grzywny i generycznych wersji nazywa. Nie widzę tego problemu z MSVC 2010 z wyłączonymi rozszerzeniami i tym samym przypadkiem z ideonem here. Wywoływana jest wyspecjalizowana wersja funkcji. Teraz pytanie brzmi: czy jest to błąd w Kompilatorze Sun?
Jeśli tak, w jaki sposób możemy złożyć zgłoszenie błędu?
Czy usunięcie const może workarodun to? – PlasmaHH
Tak. Usunięcie const lub dodanie const do int arr [] to obejście. Ale chciałbym się dowiedzieć, czy to błąd w kompilatorze, czy też moje zrozumienie jest złe. – Jagannath
Są szanse, że najnowsze wersje clangu, gcc, comeau i msvc się zgadzają, to jest błąd w SunCC. Zauważ też, że SunCC jest (nie) znany z tego, że jest zapluskwiony. Co prowadzi do pytania: dlaczego nie używać gcc? – PlasmaHH