类型比较的Boost静态断言
Boost Static Assertion for Type Comparision
下面的问题给我带来了编译器错误,我不知道如何正确地编写
struct FalseType { enum { value = false }; };
struct TrueType { enum { value = true }; };
template <typename T1, typename T2>
struct IsSame
{
typedef typename FalseType Result;
};
template <typename T>
struct IsSame<T,T>
{
typedef typename TrueType Result;
};
BOOST_STATIC_ASSERT( (IsSame< Foo::FooClass1 , Foo::FooClass1 >::Result::value) );
这个静态断言在使用时不应该失败,但CUDA的编译器NVCC不知何故给了我以下错误:
error C2338: (IsSame< Foo::FooClass1 , Foo::FooClass1 >::Result::value)
我不知道该怎么办,所有其他静态断言都有效,但类型比较不起作用,上面出了什么问题?打字错误支架?
我无法获得在NVCC下工作的类型比较?
有什么想法吗?
看来MSVC(由NVCC路由到(在上述版本中也有问题。。。。嗯…
===============编辑========================这里有一个在MSVC中不起作用的片段!
这个片段应该在MSVC中编译,但它没有,所以我假设编译器错误:
错误C2118:负下标(WHHHHHYYYY(奇怪。。。。
#include <iostream>
using namespace std;
struct FalseType { static const bool value = false ; };
struct TrueType { static const bool value = true ; };
template <typename T1, typename T2>
struct IsSame
{
typedef ::FalseType Result;
static const bool result = false;
};
template <typename T>
struct IsSame<T,T>
{
typedef ::TrueType Result;
static const bool result = true;
};
namespace OtherType{
struct Type1{};
};
template< typename _T> // Settings from below
struct Settings{
typedef _T myT;
typedef char static_assert_failed[ ((IsSame< _T,OtherType::Type1>::Result::value)) ? 1 : -1 ]; // USE HERE only ::result works, (BUT WHY)
};
int main(){
cout << (IsSame<OtherType::Type1,OtherType::Type1>::Result::value)<< endl;
}
typedef typename FalseType Result;
typedef typename TrueType Result;
这是错误的,因为FalseType
和TrueType
不是从属名称,因此typename
在这里是非法的。
应该是
typedef FalseType Result;
typedef TrueType Result;
更新
看来
IsSame < _T, OtherType::Type1 >::Result::value
是非法的。问题是
IsSame < _T, OtherType::Type1 >::Result
必须由typename
限定,但在语法上是不可能的,也就是说,以下内容也是非法的
(typename IsSame <_T, OtherType::Type1 >::Result)::value
我找到了以下解决方案,使其发挥作用。
typedef typename IsSame <_T, OtherType::Type1 >::Result RealResult;
typedef char static_assert_failed[RealResult::value ? 1 : -1];
HTH。
相关文章:
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- uint_not_usable_without_attribute在业力规则中使用数字生成器时静态断言失败
- 初始值设定项列表构造和静态断言
- 如何在 c++11 中静态断言 std::array 类成员进行排序?
- 我如何静态断言static_cast是 noexcept?
- 绕过特征静态断言
- Qt C++:静态断言失败:信号和插槽参数不兼容
- 捕获的静态断言 lambda
- 静态断言添加操作是否可用
- 错误:静态断言失败:std ::线程参数必须在转换为rvalues后不可行
- 是否允许编译器在静态断言中评估重言式
- 公共继承的静态断言
- 静态断言失败,出现"Windows headers require the default packing option..."
- 静态断言,如果在编译时不知道表达
- 如果标头包含在另一个标头中,但不包含 CPP,则静态断言
- 静态断言 std::array 的大小,其类型是使用 decltype 从成员函数的返回值中获取的
- 围绕静态断言不完整的类型
- C 11多态映射键静态断言失败:哈希函数必须与密钥类型的参数无关
- 包含多态对象的向量:静态断言误差
- 与复制构造函数不同的移动构造函数的静态断言