2009-09-30 3 views
0

образца коды выглядит следующим образом:структуры в классе шаблона

struct TEMP 
{ 
    int j; 
    TEMP() 
    { 
    j = 0; 
    } 
}; 

template<typename T> 
class classA 
{ 
    struct strA 
    { 
     long i; 
     strA():i(0) {} 
    }; 
    static strA obj_str; 
    classA(); 
}; 

template<typename T> 
classA<T>::classA() 
{} 

template<typename T> 
classA<TEMP>::strA classA<TEMP>::obj_str; 

int main() 
{ 
    return 0; 
} 

при компиляции этого кода, я получаю следующее сообщение об ошибке:

test1.cpp:32: internal compiler error: in import_export_decl, at cp/decl2.c:1970 Please submit a full bug report, with preprocessed source if appropriate. See http://bugzilla.redhat.com/bugzilla> for instructions. Preprocessed source stored into /tmp/ccUGE0GW.out file, please attach this to your bugreport.

Я строй этого кода на x86_64-RedHat-Linux машине , а версия gcc - версия gcc 4.1.2 20070626 (Red Hat 4.1.2-14)

Обратите внимание, что этот код уже был построен с версией gcc версии 3.4.5 20051201 (Red Hat 3.4.5-2) на i386- машина redhat-linux.

Любая идея, почему это невозможно построить с помощью gcc 4.1.2.

Заранее спасибо.

+0

Вы отправили полный отчет об ошибке? Это то, что говорит вам ошибка. На данный момент вы можете попробовать использовать другой компилятор [версия]. – strager

+0

Нашли сообщение об ошибке здесь: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24791 - это похоже на вариант этого. –

+0

Внутренняя ошибка компилятора всегда означает, что что-то не так с компилятором, поэтому не думайте, что это ваша ошибка. – 2009-09-30 10:57:54

ответ

3

В любом случае ваш код не имеет особого смысла в следующем объявлении.

template<typename T> 
classA<TEMP>::strA classA<TEMP>::obj_str; 

Поскольку параметр T не используется нигде в декларации. Я думаю, вы либо хотели написать одну из следующих вещей:

// definition of static member of template 
template<typename T> 
typename classA<T>::strA classA<T>::obj_str; 

// ... or declaration of static member specialization for `T=TEMP` of template 
template<> 
classA<TEMP>::strA classA<TEMP>::obj_str; 

Я подозреваю, что это был первый. Для аварии компилятор - что, конечно, не должно произойти в любом случае :)


Edit: Исправлена ​​ошибка уже исправлена ​​в 4.4.1, по крайней мере - я думаю, что нет никакой необходимости в отчетности больше.

+0

Правильно, эта ошибка была зарегистрирована и исправлена ​​в более высокой версии. Но я думал, что если можно построить его с той же версией и с некоторым изменением кода. И да, с изменением кода, код компилируется. Спасибо :) – Ruchi

0

Я буду следить за сообщением об ошибке.