【问题标题】:How to define static member variable from class template with specialization?如何从具有专业化的类模板中定义静态成员变量?
【发布时间】:2019-09-30 22:46:11
【问题描述】:

好的,我有这个代码:

// default implementation just uses a mutex to serialize access
template <typename T, typename=void>
struct kernport {
    static const bool atomic = false;

    // constructor
    kernport(T value=T()) {
        set(value);
    }

    // get/set value
    T    get()         const { std::unique_lock<std::mutex> lock(lock_); return value_;  }
    void set(const T& value) { std::unique_lock<std::mutex> lock(lock_); value_ = value; }

private:
    mutable std::mutex lock_;
    T value_;
};


// specialization if std::atomic<T> exists
template <typename T>
struct kernport<T, void_type<decltype(std::atomic<T>())>> {
    static const bool atomic = true;

    // constructor
    kernport(T value=T()) {
        set(value);
    }

    // query port value
       T get() const         { return value_.load(std::memory_order_acquire);  }
    void set(const T& value) { value_.store(value, std::memory_order_release); }

private:
    std::atomic<T> value_;
};

如果我尝试检查kernport&lt;bool&gt;::atomic,我会得到可怕的未定义引用。好的,所以我需要在类之外定义成员:

template <typename T> const bool kernport<T>::atomic;

不幸的是,这样做,我得到:

inc/skunk/dataflow/kernel.h:472:47:错误:模板定义 非模板 'const bool sk::kernport::atomic' 模板 const bool kernport::atomic;

对于我的生活,我可以找到正确的语法。这个怎么写?

【问题讨论】:

    标签: c++ c++11 decltype partial-specialization class-template


    【解决方案1】:

    也许

    template <typename T1, typename T2>
    const bool kernport<T1, T2>::atomic;
    
    template <typename T1>
    const bool kernport<T1, void>::atomic;
    

    ?

    不要忘记第二个(默认为void)模板参数。

    【讨论】:

    • 这两种方法似乎都不起作用,我在编译时再次得到未定义的引用。
    • @gct - 抱歉:我的错误:我在专业版中看到了atomic,但在主版本中没有看到。我今天太累了。
    • 两个模板参数也不起作用,我得到一个未定义的引用错误。
    • @gct - 两者都有?一门主修,一门专攻?
    • 第二条语句得到“非模板的模板定义”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 2022-01-24
    • 2011-01-21
    • 2015-08-01
    相关资源
    最近更新 更多