Meu entendimento é que C ++ permite que membros const estáticos sejam definidos dentro de uma classe, desde que seja um tipo inteiro.
Por que, então, o código a seguir fornece um erro de vinculador?
#include <algorithm>
#include <iostream>
class test
{
public:
static const int N = 10;
};
int main()
{
std::cout << test::N << "\n";
std::min(9, test::N);
}
O erro que recebo é:
test.cpp:(.text+0x130): undefined reference to `test::N'
collect2: ld returned 1 exit status
Curiosamente, se eu comentar a chamada para std :: min, o código compila e vincula perfeitamente (embora test :: N também seja referenciado na linha anterior).
Alguma ideia do que está acontecendo?
Meu compilador é o gcc 4.4 no Linux.
char
, você pode defini-lo como constexpr static const char &N = "n"[0];
. Observe o &
. Acho que isso funciona porque as strings literais são definidas automaticamente. Estou um pouco preocupado com isso - pode se comportar de forma estranha em um arquivo de cabeçalho entre diferentes unidades de tradução, já que a string provavelmente estará em vários endereços diferentes.
inline const int N = 10
, que até onde sei ainda tem um armazenamento em algum lugar definido pelo vinculador. Palavra-chave embutida também pode ser usada neste caso para fornecer definição de variável estática dentro do teste de definição de classe.