尝试将 C++11 代码转换为 C++03 时默认函数模板参数出错
Error in default function template arguments when trying to convert C++11 code to C++03
我正在尝试将 C++11 代码转换为 C++03 并卡在默认模板参数上。
#include <type_traits>
#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_const.hpp>
#include <boost/type_traits/conditional.hpp>
#include <boost/spirit/home/support/string_traits.hpp>
template<bool B, class T = void>
struct enable_if {};
template<class T>
struct enable_if<true, T> { typedef T type; };
template<typename T>
struct is_char
{
typedef typename enable_if<sizeof (T) == sizeof (char)>::type eif;
};
template<bool B, class T, class F>
struct conditional { typedef T type; };
template<class T, class F>
struct conditional<false, T, F> { typedef F type; };
template <typename ObjType,
typename PtrType,
typename CharType =
typename conditional<boost::is_const<PtrType>::value,
const typename ObjType::char_type,
typename ObjType::char_type>::type,
typename is_char<PtrType>::type >
CharType* char_ptr_cast(PtrType* p)
{ return reinterpret_cast<CharType*>(p); }
int main ()
{}
我收到以下错误:
> /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/c++0x_warning.h:31:2:
> error: #error This file requires compiler and library support for the
> upcoming ISO C++ standard, C++0x. This support is currently
> experimental, and must be enabled with the -std=c++0x or -std=gnu++0x
> compiler options.
>
> test.cc:35: error: no default argument for anonymous
>
> **default template arguments may not be used in function templates without -std=c++0x or -std=gnu++0x**
你能帮我解决这些错误吗?
在 C++11 中添加了 函数模板 的默认模板参数。如果你不能使用 C++11,或者你的编译器不能正确支持它,你就不能定义 typename CharType = /* whatever */
。无需重新输入那么长的 meta-function 即可实现 C++03 合规性的方法是将 CharType
重构为它自己的特征,并使用它。
template<typename ObjType, typename PtrType>
struct CharType {
typedef typename conditional<boost::is_const<PtrType>::value,
const typename ObjType::char_type,
typename ObjType::char_type>::type
type;
};
template <typename ObjType typename PtrType>
typename CharType<ObjType, PtrType>::type* char_ptr_cast(PtrType* p)
{ return reinterpret_cast<typename CharType<ObjType, PtrType>::type*>(p); }
此外,<type_traits>
header 仅是 C++11 header。由于您在标准库中的标准版本检查失败后点击了 #error
指令,这很可能是罪魁祸首。你不能包含它。
我正在尝试将 C++11 代码转换为 C++03 并卡在默认模板参数上。
#include <type_traits>
#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_const.hpp>
#include <boost/type_traits/conditional.hpp>
#include <boost/spirit/home/support/string_traits.hpp>
template<bool B, class T = void>
struct enable_if {};
template<class T>
struct enable_if<true, T> { typedef T type; };
template<typename T>
struct is_char
{
typedef typename enable_if<sizeof (T) == sizeof (char)>::type eif;
};
template<bool B, class T, class F>
struct conditional { typedef T type; };
template<class T, class F>
struct conditional<false, T, F> { typedef F type; };
template <typename ObjType,
typename PtrType,
typename CharType =
typename conditional<boost::is_const<PtrType>::value,
const typename ObjType::char_type,
typename ObjType::char_type>::type,
typename is_char<PtrType>::type >
CharType* char_ptr_cast(PtrType* p)
{ return reinterpret_cast<CharType*>(p); }
int main ()
{}
我收到以下错误:
> /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/c++0x_warning.h:31:2:
> error: #error This file requires compiler and library support for the
> upcoming ISO C++ standard, C++0x. This support is currently
> experimental, and must be enabled with the -std=c++0x or -std=gnu++0x
> compiler options.
>
> test.cc:35: error: no default argument for anonymous
>
> **default template arguments may not be used in function templates without -std=c++0x or -std=gnu++0x**
你能帮我解决这些错误吗?
在 C++11 中添加了 函数模板 的默认模板参数。如果你不能使用 C++11,或者你的编译器不能正确支持它,你就不能定义 typename CharType = /* whatever */
。无需重新输入那么长的 meta-function 即可实现 C++03 合规性的方法是将 CharType
重构为它自己的特征,并使用它。
template<typename ObjType, typename PtrType>
struct CharType {
typedef typename conditional<boost::is_const<PtrType>::value,
const typename ObjType::char_type,
typename ObjType::char_type>::type
type;
};
template <typename ObjType typename PtrType>
typename CharType<ObjType, PtrType>::type* char_ptr_cast(PtrType* p)
{ return reinterpret_cast<typename CharType<ObjType, PtrType>::type*>(p); }
此外,<type_traits>
header 仅是 C++11 header。由于您在标准库中的标准版本检查失败后点击了 #error
指令,这很可能是罪魁祸首。你不能包含它。