C ++ статическая инициализация шаблона элемента const - PullRequest
2 голосов
/ 04 января 2012

У меня возникают некоторые странные проблемы при попытке инициализировать статическую переменную-член const класса шаблона. Все остальные мои статические переменные инициализируются нормально, но по какой-то причине это не нравится. Я собрал некоторый пример кода для тестирования, и у него нет проблем, поэтому я действительно не знаю, что происходит.

Кроме того, у меня также есть проблемы с определением функций, которые используют typedefs, объявленные внутри класса шаблона, с той же проблемой, говоря, что не может найти тип. Эту проблему мне удалось воспроизвести, хотя в приведенном ниже коде. Я знаю, что один из способов исправить это - определить функцию внутри класса, но функция действительно велика, и я стараюсь, чтобы она соответствовала наличию всех огромных функций, определенных вне класса, чтобы упростить определение класса читать. Хотя, если это мой единственный вариант, тогда, я думаю, мне придется сделать исключение ...

class tTestType
{
    public:

        tTestType(int32_t val) : fValue(val) { }

    private:

        int32_t fValue;
};

template<class T>
class tTestTemplate
{
    public:

        tTestTemplate() { }

    private:

        typedef std::vector<int32_t> tSomeVec;

        tSomeVec mTestFunction() const;

        static const tTestType kTestStatic;
};

// Should cause the following errors but I can't reproduce them for some reason:
// error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
// error C2988: unrecognizable template declaration/definition
// error C2059: syntax error : 'constant'
template<class T>
const tTestType tTestTemplate<T>::kTestStatic(10);

// Causes the following errors:
// error C2143: syntax error : missing ';' before 'tTestTemplate<T>::mTestFunction'
// error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
// fatal error C1903: unable to recover from previous error(s); stopping compilation
template<class T>
tTestTemplate<T>::tSomeVec tTestTemplate<T>::mTestFunction() const
{
    tSomeVec result;
    result.push_back(0);
    return result;
}

Ответы [ 2 ]

1 голос
/ 04 января 2012

Благодаря коллеге я нашел решение обеих проблем.

Для первого вопроса, статической переменной-члена, я переместил определение в файл CPP и использовал специализацию шаблона. Причина, по которой это не нарушается в тестовом коде, который я разместил, заключается в том, что основной тип (int, float и т. Д.) Решает проблему, но если вы используете более сложный тип, такой как класс, то это должно вызвать ошибку. Я знаю, что это не лучшее решение в мире, но это единственное, что работает несколько чистым. Если у кого-то есть лучшее решение, пожалуйста, дайте мне знать:

template<>
const tTestType tTestTemplate<uint32_t>::kTestStatic(10);

Для второго вопроса - функция, использующая тип, объявленный внутри класса, я пошел с решением, которое я описал в первоначальном посте, и просто переместил определение функции внутри класса шаблона, так что теперь это выглядит так:

template<class T>
class tTestTemplate
{
    public:

        tTestTemplate() { }

    private:

        typedef std::vector<int32_t> tSomeVec;

        // Declaring the function inside the class to fix the compiler error.
        tSomeVec mTestFunction() const
        {
            tSomeVec result;
            result.push_back(0);
            return result;
        }

        static const tTestType kTestStatic;
};
0 голосов
/ 04 января 2012

Я сделал 2 изменения в вашем коде и его компиляция в порядке.

class tTestType
{
    public:

        tTestType(int32_t val) : fValue(val) { }

    private:

        int32_t fValue;
};

typedef std::vector<int32_t> tSomeVec;

template<class T>
class tTestTemplate
{
    public:

        tTestTemplate() { }

    private:

        tSomeVec mTestFunction() const;

        static const tTestType kTestStatic;
};

// Should cause the following errors but I can't reproduce them for some reason:
// error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
// error C2988: unrecognizable template declaration/definition
// error C2059: syntax error : 'constant'
template<class T>
const tTestType tTestTemplate<T>::kTestStatic(10);

// Causes the following errors:
// error C2143: syntax error : missing ';' before 'tTestTemplate<T>::mTestFunction'
// error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
// fatal error C1903: unable to recover from previous error(s); stopping compilation
template<class T>
tSomeVec tTestTemplate<T>::mTestFunction() const
{
    tSomeVec result;
    result.push_back(0);
    return result;
}
...