【问题标题】:Set a class static设置类静态
【发布时间】:2013-12-13 02:27:54
【问题描述】:

我正在尝试编写一个课程作为练习,并且有以下内容:

template <class Foo>
class Bar
{
protected:
    Foo _x,_y,_z;
public:
    Bar(Foo x, Foo y, Foo z) {_x=x; _y=y; _z=z;};
    Bar() {_x=0; _y=0; _z=0;};

    static const Bar<Foo> X;
};

我想将X 初始化为(0,1,0),但不知道该怎么做。我想声明 X =(0,1,0) 就像在程序开始时声明 #define pi = 3.142 一样。我该怎么做呢?

【问题讨论】:

  • 你有 C++11 可用吗?

标签: c++ class templates variable-declaration


【解决方案1】:

您所做的很好,但您可能会遇到链接器错误,因为您没有为 X 提供任何存储空间。你需要这样做:

template <class Foo>
class Bar
{
protected:
    Foo _x,_y,_z;
public:
    Bar(Foo x, Foo y, Foo z) {_x=x; _y=y; _z=z;};
    Bar() {_x=0; _y=0; _z=0;};

    static const Bar<Foo> X;
};

template <typename Foo>
const Bar<Foo> Bar<Foo>::X(0, 1, 0);

与非模板静态变量不同,这可以放在标题中 - 与其他模板一样,Bar&lt;Foo&gt;::X 的重复定义将在链接时合并。

【讨论】:

    【解决方案2】:

    从类中移除静态声明:

    template <class Foo>
    class Bar
    {
    protected:
        Foo _x,_y,_z;
    public:
        Bar(Foo x, Foo y, Foo z) {_x=x; _y=y; _z=z;};
        Bar() {_x=0; _y=0; _z=0;};
    };
    
    
    const Bar<Foo> X(0,1,0); // Foo should be a type...
    

    【讨论】:

    • 但是Foo 没有在类外声明,我该如何补救呢?
    • Foo 只是你必须在某处指定的东西的模板类型。 Foo 也没有真正在类中声明。
    • 感谢您的回答,但我使用类模板的原因是因为我不想将自己束缚在int for Foo,我可能想使用@例如 987654325@,long,这就是为什么我希望坚持使用Foo
    • @BlackAdder 好的,我明白 :) ,但你应该知道,在使用常量时总是必须指定类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 2013-12-04
    相关资源
    最近更新 更多