Inicialização de membros da class Const estática em C ++

Eu gostaria de ter uma class que tenha membros estáticos , mas não consigo descobrir como fazer isso. É mesmo possível?

Eu recebo o erro:

somente membros de dados integrais const estáticos podem ser inicializados dentro de uma class

Código:

namespace misc { class CData { public: CData( ) { }; CData( int d ); CData& operator = ( const CData& d ); static const CData FIRST = CData( 512 ); //how? private: int data; }; } 

Como eu uso FIRST muito eu gostaria de estaticamente acessá-lo usando misc::CData::FIRST sem a necessidade de declará-lo em algum lugar no escopo. Isso é por acaso possível?

… sem a necessidade de declará-lo em algum lugar no escopo. Isso é por acaso possível?

Não, não é possível sem declará-lo (o que você já tentou fazer na sua declaração de class). Você provavelmente quis dizer, sem defini- lo fora da sua declaração de class. Mais uma vez a resposta é não.
Você tem que separar declaração e definição para este caso (ele só funciona com tipos integrais primitivos como int para inicializá-los diretamente na declaração de class).

Primeiro tem uma declaração simples na sua declaração de class (geralmente algo como CData.hpp )

 namespace misc { class CData { public: CData( ) { }; CData( int d ); CData& operator = ( const CData& d ); static const CData& FIRST; private: int data; }; } 

e depois defini-lo em uma unidade de compilation separada (geralmente algo como CData.cpp )

 namespace misc { const CData& CData::FIRST = CData( 512 ); } 

Para dados não integrais, algo como isto é preferido, uma vez que evita o fiasco de boot estática.

 static const CData FIRST() { static CData first(512); //only initialized once, when first requested return first; } 

… sem a necessidade de declará-lo em algum lugar no escopo. Isso é por acaso possível?

Não.

Norma C ++ n3337 § 9.4.2 / 2

Membros de dados estáticos

A declaração de um membro de dados estático em sua definição de class não é uma definição e pode ser de um tipo incompleto diferente de void cv-qualificado. A definição para um membro de dados estático deve aparecer em um escopo de namespace, incluindo a definição de class do membro. (…)

Você pode declarar um membro de dados estáticos na class:

 namespace misc { class CData { public: //... static const CData FIRST; // declaration //... } 

e defina-o em (exatamente) um dos arquivos .cpp:

 namespace misc { CData CData::FIRST = CData( 512 ); // definition } 

Esta é a solução preferida, no entanto, você precisa ter essa definição fora de sua class. Você poderia ter definido o membro em class se ele fosse de um tipo integral

Norma C ++ n3337 § 9.4.2 / 3 diz

Se um membro de dados estáticos não-volátil const é do tipo integral ou de enumeração, sua declaração na definição de class pode especificar um inicializador de chave-ou-igualdade em que cada cláusula inicializante que é uma expressão de atribuição é uma expressão constante (. ..)