Как использовать статические члены в качестве аргументов шаблона? - PullRequest
1 голос
/ 18 сентября 2010

У меня следующая структура кода:

myClass.h

class myClass
{
public:
    void DoSomething(void);
};

myClass.cpp

#include myClass.h

static const unsigned length = 5;
static myArray<float, length> arrayX;

void myClass::DoSomething(void)
{
    // does something using length and array X
}

Теперь я хочу преобразовать статическую переменную, определенную вобласть видимости файла должна быть статическим членом класса.Я делаю следующее:

myClass.h

class myClass
{
    static const unsigned length;
    static myArray<float,length> arrayX;

public:
    void DoSomething(void);
};

myClass.cpp

#include myClass.h

const unsigned myClass::length = 5;
myArray<float, length> myClass::arrayX;

void myClass::DoSomething(void)
{
    // does something using length and array X
}

Однако я получаю сообщение об ошибке:

C2975: «Длина»: недопустимый аргумент шаблона для «myArray», ожидаемое постоянное выражение во время компиляции myClass.h

Я понимаю, что получаю эту ошибку, поскольку длина еще не инициализирована в заголовочном файле,Как я могу обойти это?

Ответы [ 3 ]

4 голосов
/ 18 сентября 2010

Это должно быть постоянное выражение, поэтому лучшее, что вы можете сделать, это переместить = 5 в заголовок.

1 голос
/ 18 сентября 2010

Однако мне было интересно, есть ли способ обойти это.

Посмотрите на свой код еще раз.Это myArray<float,length> объявлено как член данных класса в заголовке.
Чтобы компилятор знал, что такое myClass, он должен знать полное определение этого члена данных.Но полное определение myArray<float,length>, в свою очередь, требует известности length, потому что без аргументов шаблона myArray - это не тип, а шаблон, и члены данных должны быть типами, а не шаблонами классов.

Из этого ясно, что для того, чтобы экземпляр myArray был членом класса, при компиляции класса необходимо знать length, myArray должен быть членом.

0 голосов
/ 19 сентября 2010

Вы пробовали:

myArray<float, myClass::length> myClass::arrayX;
               ^^^^^^^^^^

Вам также может понадобиться изменить заголовок:

class myClass
{
    static const unsigned length = 5;

и измените определение myClass :: length в .cpp, чтобы оно не содержало "= 5" (или удалите его полностью).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...