C++ 用于类型比较的Boost静态断言

C++ 用于类型比较的Boost静态断言,c++,cuda,assertion,C++,Cuda,Assertion,下面的问题给了我编译器错误,我不知道如何正确地编写它 struct FalseType { enum { value = false }; }; struct TrueType { enum { value = true }; }; template <typename T1, typename T2> struct IsSame { typedef typename FalseType Result; }; template <typename T> struc

下面的问题给了我编译器错误,我不知道如何正确地编写它

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) );
struct FalseType{enum{value=false};};
结构TrueType{enum{value=true};};
模板
结构名称
{
typedef typename false类型结果;
};
模板
结构名称
{
typedef typename TrueType结果;
};
BOOST_STATIC_ASSERT((IsSame::Result::value));
此静态断言在使用时不应失败,但CUDA的编译器NVCC以某种方式给了我以下错误:

error C2338: (IsSame< Foo::FooClass1 , Foo::FooClass1 >::Result::value)
错误C2338:(ISAME::结果::值)
我不知道该怎么办,所有其他静态断言都可以工作,但类型比较不起作用,到底出了什么问题?打字错误括号

我不能让我的类型比较在NVCC下工作

有什么想法吗

似乎MSVC(由NVCC路由到)在上述版本中也存在问题。。。。嗯

================编辑======================== 这里有一个在MSVC中不起作用的代码段

这个被剪断的应该在MSVC中编译,但它没有,所以我假设编译器错误:

错误C2118:负下标(WHHHHYYYYY)奇怪

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

}
#包括
使用名称空间std;
结构FalseType{static const bool value=false;};
结构TrueType{static const bool value=true;};
模板
结构名称
{
typedef::false类型结果;
静态常数布尔结果=假;
};
模板
结构名称
{
typedef::TrueType结果;
静态常数布尔结果=真;
};
命名空间其他类型{
结构类型1{};
};
模板//下面的设置
结构设置{
typedef_T myT;
typedef char static_assert_失败[(IsName<\u T,OtherType::Type1>::结果::值]?1:-1];//仅在此处使用::结果有效,(但为什么)
};
int main(){
库特
这是错误的,因为
FalseType
TrueType
不是依赖名称,因此
typename
在这里是非法的

应该是

typedef FalseType Result;
typedef  TrueType Result;
更新

看来

IsSame < _T, OtherType::Type1 >::Result::value 
我找到了下面的解决方案,使它工作

typedef typename IsSame <_T, OtherType::Type1 >::Result RealResult;
typedef char static_assert_failed[RealResult::value ? 1 : -1];
typedef typename isname::Result RealResult;
typedef char static_assert_失败[RealResult::value?1:-1];

HTH.

不确定NVCC和您的错误,但是您可以通过说
模板结构IsSame:FalseType{};
模板结构IsSame:TrueType{};
来简化构造。相同的代码在GCC下工作吗?如果是,在NVCC中可能是一个but。在非依赖名称上使用typename是合法的(在正确的上下文中),但它在这里是非法的,因为它被应用于一个不合格的名称。(14.6/5)这不是它不起作用的原因,MSVC做了一些错误的事情…ehm查看上面的代码片段,但感谢您提到它!它是错误的:-)@加布里埃尔:嗯……这很有趣。我现在正在看。如果我发现任何东西,会更新的。啊好的,耶:-)谢谢你指出,我没有看到!所以我需要一个更好的IsSame比较…@加布里埃尔:看看我贴的这个问题:
IsSame < _T, OtherType::Type1 >::Result 
(typename IsSame <_T, OtherType::Type1 >::Result)::value 
typedef typename IsSame <_T, OtherType::Type1 >::Result RealResult;
typedef char static_assert_failed[RealResult::value ? 1 : -1];