C ++静态const模板成员初始化

时间:2012-01-04 03:37:05

标签: c++ templates static initialization const

我在尝试初始化模板类的静态const成员变量时遇到了一些奇怪的问题。我所有的其他静态变量初始化都很好,但由于某种原因它不喜欢这个。我把一些示例代码放在一起进行测试,它没有问题所以我真的不知道发生了什么。

除此之外,我还遇到了一些问题,这些问题定义了使用在模板类中声明的typedef的函数,同样的问题是它无法找到类型。这个问题我已经能够在下面的代码中重现。我知道解决它的一种方法是定义类内部的函数,但是函数非常大,我试图保持它与在类之外定义的所有大型函数保持一致,以使类定义更容易阅读。如果这是我唯一的选择,那么我想我必须做出例外......

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 个答案:

答案 0 :(得分:1)

感谢同事,我找到了解决这两个问题的方法。

对于第一个问题,静态成员变量,我已将定义移动到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;
};

答案 1 :(得分:-1)

我对您的代码进行了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;
}