繁体   English   中英

混淆定义静态C ++模板类成员

[英]confused defining a static C++ template class member

我正在尝试使用静态成员定义模板类,以便模板的每个特化都有自己的静态成员。 此外,静态成员是类本身的一个对象(用作链接列表的标记。)我不确定这甚至可以在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 ++版本,因为此代码的最终目标是Arduino,它目前使用g ++ v4.3.2并且不支持C ++ 11(或者不使用C + +11)。

谢谢您的帮助。

尝试在类模板中使用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; }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM