2016-07-22 15 views
3

Ich habe ein Projekt, das mit GCC-4.4.7 und GCC-4.9.0 kompiliert werden muss.Übergabe der Vorlagenklasse als Vorlagevorlagenparameter innerhalb der Klassenmitgliedsfunktion

Wir verwenden einen Code, der eine Vorlagenklasse als Vorlagenschablonenparameter an eine andere Klasse übergibt. Während der Code bei GCC-4.9.0 gut kompiliert wird, schlägt er bei GCC-4.4.7 fehl. Hier

ist eine Reproduktion des Fehlers:

#include <iostream> 
using namespace std; 

struct E 
{ 
    int a; 
    E(int b) : a(b) {} 
}; 

template<template<int B> class C, int D> struct A 
{ 
    void print() 
    { 
     E e(D); 
     cout << e.a << endl; 
    } 
    int a; 
}; 

template<int B> struct C 
{ 
    const static int a = B; 
    void print() 
    { 
     A<C, B> a; 
     a.print(); 
    } 
}; 

int main() { 
    C<3> c; 
    c.print(); 
    return 0; 
} 

Auf Compilation:

[[email protected] ~]$ g++-4.9 Test.cpp -o Test 
[[email protected] ~]$ 
[[email protected] ~]$ g++-4.4 Test.cpp -o Test 
Test.cpp:43: error: type/value mismatch at argument 1 in template parameter list for ‘template<template<int B> class C, int D> struct A’ 
Test.cpp:43: error: expected a class template, got ‘C<B>’ 
Test.cpp:43: error: invalid type in declaration before ‘;’ token 
Test.cpp:44: error: request for member ‘print’ in ‘a’, which is of non-class type ‘int’ 

Wie der Fehler beheben und es ordnungsgemäß mit GCC-4.4.7 zu kompilieren bekommen?

NB: nur ++ 98 Standard-C, ist der Code sehr alt.

Antwort

4

Namenssuche für C findet den Namen der injizierten Klasse, und der alte Compiler, den Sie verwenden, unterstützt die Verwendung als Vorlagenname nicht.

Qualifizieren Sie den Namen.

A< ::C,B> a; 
+0

Wow !! Das wusste ich nicht !! Damm der Compiler muss archaisch sein. Danke Mann, du bist ein Lebensretter –

Verwandte Themen