Законно ли в C ++ передавать адрес статического const int без определения в шаблон?
У меня возникают проблемы с решением, должен ли этот код компилироваться, или если только у обоих компиляторов, которые я пробовал, есть ошибка (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 являетсяnot значение времени выполнения. Память выделяется для статически распределенных переменных во время компиляции.