【问题标题】:confused defining a static C++ template class member混淆定义静态 C++ 模板类成员
【发布时间】:2014-04-06 01:05:50
【问题描述】:

我正在尝试使用静态成员定义模板类,以便模板的每个特化都有自己的静态成员。此外,静态成员是类本身的一个对象(用作链表的哨兵。)我不确定这甚至可以在 C++ 中合法地完成,但如果是这样,我正在挣扎而不是得到搞定了。

一个展示我想要完成的小样本是:

template<class E> class LL {
    static LL<E>   l;
};

class A {
};

template<typename A>
typename <class A>LL LL<A>::l;

当我使用 g++(4.8.1 版)编译时,它会报告:

g++ -Wall -o t-static.o t-static.cpp
t-static.cpp:9:14: error: expected nested-name-specifier before ‘<’ token
     typename <class A>LL LL<A>::l;
              ^
t-static.cpp:9:14: error: expected unqualified-id before ‘<’ token

(错误在文件的列表行上。)

恐怕我并不真正了解诊断或类型名称,并且已经为此苦苦挣扎了一段时间,唯一的结果是我可以收到不同的错误消息。我发现了很多与此相关的问题,但没有一个问题能帮助我找到解决方案。

最后一点,我希望解决方案不是特定于特定的 g++ 版本,因为此代码的最终目标是目前使用 g++ v4.3.2 且不支持 C++11(或不支持使用 C++11。)

感谢您的帮助。

【问题讨论】:

    标签: c++ templates static typename


    【解决方案1】:

    尝试在类模板中使用static 成员会令您有些痛苦,因为您需要显式地实例化它们。为了快速解决当前的问题:您只需要使用正确的定义语法。

    template <typename E>
    static LL<E> LL<E>::l;
    

    但是,如果编译器最终在多个翻译单元中实例化此数据成员,您将获得多重定义的符号。由于各种原因,最好将对象嵌套到函数中并从那里返回引用:

    template <typename E>
    class LL {
        static LL<E>& l();
        // ...
    };
    
    template <typename E>
    LL<E>& LL<E>::l() { static LL<E> rc; return rc; }
    

    也就是说,你应该寻求不来使用任何全局对象!它们往往会导致很多问题,即使它们的访问权限仅限于从给定的类中完成。

    【讨论】:

    • 您反对全局对象的评论,您能否为我的应用程序详细说明或建议不同的模式?如前所述,静态对象是链表的哨兵,我选择了该解决方案,因为它处理链表的代码要简单得多。我更喜欢使用 STL 容器,但目标是资源受限(2KB RAM,32KB 程序存储)。有限的测试用例表明使用自定义列表显着减少资源消耗。也许您可以指出描述潜在问题的材料。 (搜索发现“静态初始化顺序惨败” - 是这样吗?)
    猜你喜欢
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多