2017-03-29 6 views
0

Ich habe ein paar Zeilen, die gut auf meinem System kompilieren, aber nicht auf einem Kollegen-System kompilieren. Deshalb möchte ich fragen, wie die Go-to-Lösung für das Problem aussehen würde. Ich muss mit einer enum umgehen, die implizit definiert, wie viel Platz ich für eine bereitstellen muss. Andere Teile des Codes verwenden auch FooSize als statisch. (Optimierung)Initialisiere ein statisches Konst-Mitglied mit einem Template-Argument

Meine aktuelle Implementierung sieht wie folgt aus

enum class FooType 
{ 
    ShortFoo, 
    LongFoo 
}; 

// defined in a different file 
template <FooType FType> 
class FooContainer 
{ 
public: 

    static const unsigned int FooSize {(FType == FooType::ShortFoo) ? 32 : 64 }; 

    std::array<float, FooSize> fooArray; 

}; 

Der Code scheint Probleme auf älteren llvm/Klirren Compiler zu erstellen. 32 und 64 werden eigentlich über Pre-Prozessor definiert. Ich könnte einfach die FooType überspringen und die Größe als Vorlage Argument verwenden, aber ich würde gerne wissen, was die zuverlässigste Methode der Initialisierung FooSize wäre.

+0

Wie ältere Klirren Compiler verwandeln werden? Sie unterstützen C++ 11? (Enum-Klassen und 'std :: array' sind C++ 11-Funktionen). Und, bitte, können Sie den genauen Fehler transkribieren? – max66

+0

LLVM 5.1, so ist es XCode 5.1.1. Wir benutzen C++ 11, was ein bisschen seltsam ist. (Wäre nicht so, dass ein Compiler, der sich darüber beschwert, C++ 11 unterstützen würde) Fehler: 'In-Class-Initialisierer für statische Datenmitglieder ist kein konstanter Ausdruck –

Antwort

1

Ihr Code scheint mir korrekt zu sein und kompiliert ohne Probleme mit meinen olds g ++ (4.9.2) und clang ++ (3.5).

Aber nach der Fehlermeldung, könnte sein, dass Ihr Compiler nicht korrekt die C++ 11 Deklaration/Initialisierung der statischen Datenelemente

Ich schlage vor, Sie in der folgenden Art und Weise zu versuchen, unterstützt

template <FooType FType> 
class FooContainer 
{ 
public: 
    static const unsigned int FooSize; 

    std::array<float, FooSize> fooArray; 

}; 

template <FooType FType> 
int unsigned const FooContainer<FType>::FooSize 
    = ((FType == FooType::ShortFoo) ? 32 : 64); 

oder (ich nehme an ist besser)

template <FooType FType> 
class FooContainer 
{ 
public: 

    static const unsigned int FooSize {(FType == FooType::ShortFoo) ? 32 : 64 }; 

    std::array<float, FooSize> fooArray; 

}; 

template <FooType FType> 
int unsigned const FooContainer<FType>::FooSize; 

Sie können auch versuchen FooSize als constexpr definieren statt const.

könnte andere Lösung FooSize in einem Template-Parameter

template <FooType FType, 
    std::size_t FooSize = (FType == FooType::ShortFoo) ? 32 : 64 > 
class FooContainer 
{ 
public: 
    std::array<float, FooSize> fooArray; 
}; 
Verwandte Themen