У меня нет возможности копирования (наследуется от boost::noncopyable
) класс, который я использую в качестве пользовательского пространства имен. Кроме того, у меня есть другой класс, который использует предыдущий, как показано здесь:
#include <boost/utility.hpp>
#include <cmath>
template< typename F >
struct custom_namespace
: boost::noncopyable
{
F sqrt_of_half(F const & x) const
{
using std::sqrt;
return sqrt(x / F(2.0L));
}
// ... maybe others are not so dummy const/constexpr methods
};
template< typename F >
class custom_namespace_user
{
static
::custom_namespace< F > const custom_namespace_;
public :
F poisson() const
{
return custom_namespace_.sqrt_of_half(M_PI);
}
static
F square_diagonal(F const & a)
{
return a * custom_namespace_.sqrt_of_half(1.0L);
}
};
template< typename F >
::custom_namespace< F > const custom_namespace_user< F >::custom_namespace_();
этот код приводит к следующей ошибке (даже без создания экземпляра):
ошибка: нет ‘const custom_namespace custom_namespace_user :: custom_namespace_ ()’ функция-член объявлена в классе ‘custom_namespace_user’
Следующий путь не является законным:
template< typename F >
::custom_namespace< F > const custom_namespace_user< F >::custom_namespace_ = ::custom_namespace< F >();
Что я должен сделать, чтобы объявить эти два класса (первый как не копируемый статический константный член класса второго)? Это осуществимо?
Ваш код анализируется как объявление функции, а не как определение объекта.
Решение состоит в том, чтобы избавиться от круглых скобок:
template< typename F > ::custom_namespace< F > const custom_namespace_user< F >::custom_namespace_;
Других решений пока нет …