Мне трудно решить, должен ли этот код компилироваться, или если только у обоих компиляторов, которые я пробовал, есть ошибка (GCC 4.2 и Sun Studio 12).В общем, если у вас есть статический член класса, который вы объявляете в заголовочном файле, вы должны определить его в некотором исходном файле.Однако в стандарте сделано исключение для статических константных интегралов.Например, это разрешено:
#include <iostream>
struct A {
static const int x = 42;
};
Без необходимости где-либо добавлять определение x вне тела класса.Я пытаюсь сделать то же самое, но я также беру адрес x и передаю его шаблону.Это приводит к ошибке компоновщика с жалобой на отсутствие определения.Приведенный ниже пример не связывает (отсутствует определение для A :: x), даже если он находится в одном и том же исходном файле:
#include <iostream>
template<const int* y>
struct B {
static void foo() { std::cout << "y: " << y << std::endl; }
};
struct A {
static const int x = 42;
typedef B<&x> fooness;
};
int main()
{
std::cout << A::x << std::endl;
A::fooness::foo();
}
Что странно, поскольку работает, пока я не передаюадрес к шаблону.Это ошибка или как-то технически совместимая со стандартами?
Редактировать: Я должен указать, что & A :: x является , а не значением времени выполнения.Память выделяется для статически распределенных переменных во время компиляции.