Повысить статическое утверждение для сравнения типов
Следующая проблема дает мне ошибки компилятора, и я не уверен, как правильно ее написать
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)
Я не знаю, что делать, все остальные STATIC ASSERTIONS работают, но сравнение типов - нет, что там плохого? Опечатка? Скобки?
Я не могу получить сравнение типов для работы под 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;
}
1 ответ
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];
НТН.