Как определить статическую переменную-член из шаблона класса со специализацией? - PullRequest
0 голосов
/ 01 октября 2019

ОК. У меня есть этот код:

// 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;

И я могу найтинаписать синтаксис. Как мне написать это?

1 Ответ

0 голосов
/ 01 октября 2019

Может быть

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

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

?

Не забудьте второй (по умолчанию void) параметр шаблона.

...