2014-07-02 16 views
6

Mam klasy zadeklarowane w następujący sposóbbłąd kompilatora przy inicjalizacji constexpr członek klasy statyczne

class A 
{ 
    struct B 
    { 
     constexpr 
     B(uint8_t _a, uint8_t _b) : 
      a(_a), 
      b(_b) 
     {} 

     bool operator==(const B& rhs) const 
     { 
      if((a == rhs.a)&& 
       (b == rhs.b)) 
      { 
       return true; 
      } 
      return false; 
     } 

     uint8_t a; 
     uint8_t b; 
    }; 

    constexpr static B b {B(0x00, 0x00)}; 

}; 

Ale g ++ mówi

error: field initializer is not constant

nie może dowiedzieć się, gdzie się mylę.

Doceniamy każdą pomoc!

Dzięki i odpowiedzi!

+0

Jaką wersję GCC? – Manu343726

+0

@ Manu343726 gcc (Debian 4.7.2-5) 4.7.2 – niebelung

+1

Przeczytaj [to] (http://stackoverflow.com/a/11523155/1609356). Myślę, że to dokładnie ten sam problem. – Manu343726

Odpowiedz

2

This will work:

#include <cstdint> 
#include <iostream> 

class A 
{ 
    struct B 
    { 
     bool operator==(const B& rhs) const 
     { 
      if((a == rhs.a)&& 
       (b == rhs.b)) 
      { 
       return true; 
      } 
      return false; 
     } 

     uint8_t a; 
     uint8_t b; 
    }; 

    public: 
    constexpr static B b {0x61, 0x62}; 

}; 

int main() { 
    std::cout << '{' << A::b.a << ',' << A::b.b << '}' << std::endl; 
} 

Usuwanie konstruktora z struct pozwoli initializer szelki do pracy. To naprawdę nie pomoże, jeśli planujesz zrobić coś fajnego w konstruktorze.

8

Clang jest bardziej przydatne:

27 : error: constexpr variable 'b' must be initialized by a constant expression 
constexpr static B b {B(0x00, 0x00)}; 
        ^~~~~~~~~~~~~~~~ 
27 : note: undefined constructor 'B' cannot be used in a constant expression 
constexpr static B b {B(0x00, 0x00)}; 
        ^
8 : note: declared here 
B(uint8_t _a, uint8_t _b) : 
^ 

ciągu usztywniających lub równy-inicjator o zmiennej składowej, konstruktorów (w tym konstruktorów klas zagnieżdżonych) są uważane za zdefiniowana; to dlatego, że jest to uzasadnione dla konstruktora, aby zapoznać się z wartościami zmiennych składowych, a więc zmienne składowe muszą być zdefiniowane pierwszy, nawet jeśli są leksykalnie później w pliku:

struct A { 
    struct B { int i; constexpr B(): i{j} {} }; 
    constexpr static int j = 99; 
}; 

Rozwiązaniem jest umieszczenie B zewnątrz A, a może w klasie bazowej.

Powiązane problemy