2017-07-03 7 views
0

Lorsque j'ai essayé de compiler avec icpc, il montre que "l'expression doit avoir un type de classe". Je suis confus à ce sujet. S'il vous plaît aider.Après avoir déclaré un échec de __m256 pour accéder à ses membres

int main() 
{ 
    __m256d temp; 
    temp.m256d_f64[0] = 1; 
    return 0; 
}  
+1

Quel compilateur/plate-forme? –

+0

@HannesHauptmann Ubuntu 16.04.2 et Intel C++ –

+0

Pour autant que je sache, vous ne pouvez pas accéder directement aux valeurs comme dans votre code. Essayez d'utiliser une fonction qui fait cela à la place. –

Répondre

0

Je peux reproduire ce problème de mon côté. Dans le immintrin.h livré avec compilateur Intel, nous avons la définition suivante __m256d:

typedef struct _MMINTRIN_TYPE(32) __m256d { 
    double m256d_f64[4]; 
} __m256d; 

Dans la définition ci-dessus, le nom struct et alias sont les mêmes qui confond le compilateur en cours. Compilateur Intel ne semble pas reconnaître le nom de typedef comme une classe qui peut prouvé avec une testcase plus petite:

$ cat test1.cc 
typedef struct __m256d { 
    double m256d_f64[4]; 
} m256d; 

int main() 
{ 
    __m256d temp; 
    temp.m256d_f64[0] = 1; 
    return 0; 
} 
$ icpc test1.cc –c 

Quand je change le typedef et instancier température comme indiqué ci-dessous (utilisez le nom typedefed au lieu du nom struct) , ICC échoue mais GCC fonctionne:

$ cat test1.cc 
typedef struct m256d { 
    double m256d_f64[4]; 
} __m256d; 

int main() 
{ 
    __m256d temp; 
    temp.m256d_f64[0] = 1; 
    return 0; 
} 
$ icpc test1.cc -c 
test1.cc(8): error: expression must have class type 
     temp.m256d_f64[0] = 1; 
    ^

compilation aborted for test1.cc (code 2) 
$ g++ test1.cc -c 

J'ai signalé ce problème à l'équipe d'ingénierie de compilateurs d'Intel.