ОК. У меня есть этот код:
// 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' шаблон const bool kernport :: atomic;
И я могу найтинаписать синтаксис. Как мне написать это?