如何从具有专用化的类模板定义静态成员变量?
How to define static member variable from class template with specialization?
好的,我有这段代码:
// 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
(模板参数。
相关文章:
- 如何在C++中定义静态成员结构
- 指向重载静态成员的函数指针 - 在unique_ptr中用作自定义删除器
- 在类定义中推导内联静态成员函数的返回类型
- 如何声明和定义具有推导类型的静态成员
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- 初始化在类类型 #define 中定义的非静态成员数组,不带默认 ctor
- thread_local静态成员模板定义:初始化失败,GCC
- 对类的静态成员的未定义引用
- C++ dll 定义静态成员
- 我正在尝试在我的类中创建一个静态成员,但编译器警告我它是未定义的
- 如何从具有专用化的类模板定义静态成员变量?
- 在类定义和使用静态数据之外定义私有成员函数
- 具有静态模板类成员的模板类:如何定义静态成员
- 为什么在定义静态成员变量时不遵循定义顺序
- 为什么在 linux 信号事件中未定义静态成员的使用
- C++ 如何定义静态成员,哪个类具有私有构造函数
- 定义静态成员的默认参数
- 使用decltype定义静态成员(Intellisense不同意)
- 我们是否仍然需要单独定义静态成员,即使它们是在类定义中初始化的
- c++超类为子类定义静态成员变量