以下问题给我编译错误,我不知道如何正确编写
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)
我不知道该怎么做,所有其他STATIC ASSERTIONS都可以工作,但类型比较没有,那里有什么问题?错字?括号?
我不能让我的类型比较在NVCC下工作?
有什么想法吗?
IT看到MSVC(由NVCC发送)也存在上述版本的问题......嗯...
=============编辑======================== 这是一个不在MSVC工作的单位!
这个剪辑应该在MSVC中编译,但它没有,所以我假设编译器错误:
错误C2118:负下标(WHHHHYYYYYY)奇怪......
#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;
}
答案 0 :(得分:2)
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。