BOOST_STATIC_ASSERT на MSVC ++ 2010 - PullRequest
1 голос
/ 02 ноября 2011

Я использую boost 1.45.0 и имею некоторый код, который выполняет следующее:

template <typename T = some_type, std::size_t N = 3> class my_class {
    public:
typedef T value_type;
        ...
        ...
        my_class(value_type i0) {BOOST_STATIC_ASSERT(N==1); m_data[0]=i0;}
    protected:
T m_data[N]; 
            //!< The internal data array used to store indices
}

Это приводит к следующей ошибке в MS VC ++ 2010 (которая, как я понимаю, реализовала static_assert в качестве одного из их основных изменений) и никаких ошибок в MS VC ++ 2008:

 error C2338: N==1

Аналогично, есть другие ошибки в некоторых других BOOST_STATIC_ASSERT в том же коде (опущены для краткости).

Я также попытался заменить static_assert из VC ++, но получил похожую ошибку сборки (выводит строку сообщения).

Какой обходной путь существует для этого?

1 Ответ

2 голосов
/ 02 ноября 2011

Я думаю, вы можете неправильно понимать цель статических утверждений. Статические утверждения предназначены для указания свойств, которые должны быть истинными для кода для компиляции. Если вам нужно написать функцию, которая не будет сгенерирована, если какое-либо условие не выполнено, но не скомпилировано неудачно, вам нужно использовать SFINAE .

// don't forget to #include <type_traits> for std::enable_if

template <std::size_t N1 = N>
my_class(value_type i0, typename std::enable_if<N1==1>::type* = 0)
{m_data[0]=i0;}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...