Повысить статическое утверждение для сравнения типов - PullRequest
3 голосов
/ 10 июля 2011

Следующая проблема вызывает у меня ошибки компилятора, и я не уверен, как правильно ее написать

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

При использовании этого статического утверждения не должно произойти сбоя, но каким-то образом компилятор NVCC из CUDA выдает мне следующую ошибку:

error C2338: (IsSame< Foo::FooClass1 , Foo::FooClass1 >::Result::value)

Я не знаю, что делать, все остальные СТАТИЧЕСКИЕ АСПЕРТЫ работают, но сравнение типов - нет, что там плохого?Опечатка?Скобки?

Я не могу получить сравнение типов для работы под NVCC?

Есть идеи?

ОН ВИДЕТ, ЧТО MSVC (который направляется NVCC) имеет свои проблемы, какхорошо с вышеупомянутой версией .... хм ...

============= РЕДАКТИРОВАТЬ ======================== ЗДЕСЬ SNIPPET, КОТОРЫЙ НЕ РАБОТАЕТ В 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;

}

1 Ответ

2 голосов
/ 10 июля 2011
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.

...