如何从具有专用化的类模板定义静态成员变量?

How to define static member variable from class template with specialization?

本文关键字:定义 静态成员 变量 专用      更新时间:2023-10-16

好的,我有这段代码:

// 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<bool>::atomic,我会得到可怕的未定义引用。 好的,所以我需要在类之外定义成员:

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

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

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

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

也许

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

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