【问题标题】:Boost Static Assertion for Type Comparision用于类型比较的 Boost 静态断言
【发布时间】:2011-07-10 15:51:04
【问题描述】:

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

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: 负下标 (WHHHHHYYYYYY) 奇怪....

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

}

【问题讨论】:

  • 不确定 NVCC 和您的错误,但您可以通过说 template &lt;typename T1, typename T2&gt; struct IsSame : FalseType {};template &lt;typename T&gt; struct IsSame&lt;T,T&gt; : TrueType {}; 来大大简化构造。
  • 相同的代码在 GCC 下可以工作吗?如果是这样,它可能是一个但在 NVCC。

标签: c++ cuda assertion


【解决方案1】:
typedef typename FalseType Result;
typedef typename  TrueType Result;

这是错误的,因为FalseTypeTrueType 不是从属名称,因此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。

【讨论】:

  • 在非依赖名称上使用 typename 是合法的(在正确的上下文中),但在这里是非法的,因为它被应用于非限定名称。 (14.6/5)
  • 这不是它不起作用的原因,MSVC 做错了什么......嗯,用 sn-p 看上面,但谢谢你提到它!这是错误的:-)
  • @Gabriel:嗯....这很有趣。我现在正在看它。如果我发现任何东西会更新
  • 啊,好的,jeah :-) 感谢您指出,我没有看到!所以我需要一个更好的 IsSame 比较...
  • @Gabriel:看看我发布的这个问题:stackoverflow.com/questions/6642721/…
猜你喜欢
  • 2013-04-30
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多