Почему MSVC не работает с T? ⇐ C++
-
Гость
Почему MSVC не работает с T?
У меня есть что-то вроде:
#include #include использование пространства имен std; пространство имен SMSpp_di_unipi_it { #define SMSpp_insert_in_factory_h \ статический класс _init {public: _init(); } _инициализатор; \ const std::string & Private_name() const; \ статическая константа std::string & _private_name() пространство имен SMSpp_type_traits { шаблон структура т; шаблон структура t< T( U ) > { используя тип = U; }; } inline std::string && SMSpp_classname_normalise(std::string && str) { str.erase( std::remove_if( str.begin() , str.end() , ::isspace ) , стр.конец() ); while( str.front() == '(' ) { стр.pop_back(); str.erase(0, 1); } return(std::move(str)); } #define SMSpp_insert_in_factory_cpp_1_t(ИмяКласса) \ шаблон \ const std::string & \ SMSpp_type_traits::t::type::_private_name(void) { \ static const std::string _name( SMSpp_classname_normalise( \ std::string(#ClassName)); \ возврат (_имя); \ } \ \ шаблон \ const std::string & \ SMSpp_type_traits::t::type::private_name(void) const { \ return( SMSpp_type_traits::t::type::_private_name() ); \ } \ } используя пространство имен SMSpp_di_unipi_it; шаблон < класс T = void , int i = 0 > класс DummyBlockT { публика: DummyBlockT( ) {} частный: SMSpp_insert_in_factory_h; }; SMSpp_insert_in_factory_cpp_1_t( ( ( ( ( DummyBlockT< std::pair< double , int > > ) ) ) ); интервал основной() { вернуть 0; } Когда я компилирую его с помощью gcc или clang, все работает хорошо. Но если я попытаюсь скомпилировать с MSVC, вызов:
SMSpp_insert_in_factory_cpp_1_t( ( ( ( ( DummyBlockT< std::pair< double , int > > ) ) ) ); сгенерировать эту ошибку:
C:\smspp-project\SMS++\src\Configuration.cpp(37,1): ошибка C2059: синтаксическая ошибка: ')' [C:\smspp-project\cmake-build-debug\SMS++ \SMS++.vcxproj] C:\smspp-project\SMS++\src\Configuration.cpp(37,1): ошибка C2062: неожиданный тип «неизвестный тип» [C:\smspp-project\cmake-build-debug\SMS++\SMS++.vcxproj] C:\smspp-project\SMS++\src\Configuration.cpp(37,1): ошибка C2039: «тип»: не является членом «глобального пространства имен» [C:\smspp-project\cmake-build- отладка\SMS++\SMS++.vcxproj] C:\smspp-project\SMS++\src\Configuration.cpp(37,1): ошибка C3083: ' C:\smspp-project\SMS++\src\Configuration.cpp(37,1): ошибка C2039: «_private_name»: не является членом «глобального пространства имен» [C:\smspp-project\cmake-build- отладка\SMS++\SMS++.vcxproj] C:\smspp-project\SMS++\src\Configuration.cpp(37,1): ошибка C2143: синтаксическая ошибка: отсутствует ';' перед '{' [C:\smspp-project\cmake-build-debug\SMS++\SMS++.vcxproj] C:\smspp-project\SMS++\src\Configuration.cpp(37,1): ошибка C2447: '{': отсутствует заголовок функции (формальный список старого стиля?) [C:\smspp-project\cmake-build- отладка\SMS++\SMS++.vcxproj] C:\smspp-project\SMS++\src\Configuration.cpp(37,1): ошибка C2039: «private_name»: не является членом «глобального пространства имен» [C:\smspp-project\cmake-build- отладка\SMS++\SMS++.vcxproj] C:\smspp-project\SMS++\src\Configuration.cpp(37,1): ошибка C2988: нераспознаваемое объявление/определение шаблона [C:\smspp-project\cmake-build-debug\SMS++\SMS++.vcxproj] C:\smspp-project\SMS++\src\Configuration.cpp(37,1): ошибка C2059: синтаксическая ошибка: '}' [C:\smspp-project\cmake-build-debug\SMS++\SMS++.vcxproj] . . . Как я могу решить проблему для MSVC без псевдонима DummyBlockT< std::pair< double , int > >/code>, используя определение типа перед вызовом SMSpp_insert_in_factory_cpp_1_t? Или, если есть способ снять псевдоним с typedef, чтобы статически возвращать точное имя DummyBlockT< std::pair< double , int > >, а не имя псевдонима?
У меня есть что-то вроде:
#include #include использование пространства имен std; пространство имен SMSpp_di_unipi_it { #define SMSpp_insert_in_factory_h \ статический класс _init {public: _init(); } _инициализатор; \ const std::string & Private_name() const; \ статическая константа std::string & _private_name() пространство имен SMSpp_type_traits { шаблон структура т; шаблон структура t< T( U ) > { используя тип = U; }; } inline std::string && SMSpp_classname_normalise(std::string && str) { str.erase( std::remove_if( str.begin() , str.end() , ::isspace ) , стр.конец() ); while( str.front() == '(' ) { стр.pop_back(); str.erase(0, 1); } return(std::move(str)); } #define SMSpp_insert_in_factory_cpp_1_t(ИмяКласса) \ шаблон \ const std::string & \ SMSpp_type_traits::t::type::_private_name(void) { \ static const std::string _name( SMSpp_classname_normalise( \ std::string(#ClassName)); \ возврат (_имя); \ } \ \ шаблон \ const std::string & \ SMSpp_type_traits::t::type::private_name(void) const { \ return( SMSpp_type_traits::t::type::_private_name() ); \ } \ } используя пространство имен SMSpp_di_unipi_it; шаблон < класс T = void , int i = 0 > класс DummyBlockT { публика: DummyBlockT( ) {} частный: SMSpp_insert_in_factory_h; }; SMSpp_insert_in_factory_cpp_1_t( ( ( ( ( DummyBlockT< std::pair< double , int > > ) ) ) ); интервал основной() { вернуть 0; } Когда я компилирую его с помощью gcc или clang, все работает хорошо. Но если я попытаюсь скомпилировать с MSVC, вызов:
SMSpp_insert_in_factory_cpp_1_t( ( ( ( ( DummyBlockT< std::pair< double , int > > ) ) ) ); сгенерировать эту ошибку:
C:\smspp-project\SMS++\src\Configuration.cpp(37,1): ошибка C2059: синтаксическая ошибка: ')' [C:\smspp-project\cmake-build-debug\SMS++ \SMS++.vcxproj] C:\smspp-project\SMS++\src\Configuration.cpp(37,1): ошибка C2062: неожиданный тип «неизвестный тип» [C:\smspp-project\cmake-build-debug\SMS++\SMS++.vcxproj] C:\smspp-project\SMS++\src\Configuration.cpp(37,1): ошибка C2039: «тип»: не является членом «глобального пространства имен» [C:\smspp-project\cmake-build- отладка\SMS++\SMS++.vcxproj] C:\smspp-project\SMS++\src\Configuration.cpp(37,1): ошибка C3083: ' C:\smspp-project\SMS++\src\Configuration.cpp(37,1): ошибка C2039: «_private_name»: не является членом «глобального пространства имен» [C:\smspp-project\cmake-build- отладка\SMS++\SMS++.vcxproj] C:\smspp-project\SMS++\src\Configuration.cpp(37,1): ошибка C2143: синтаксическая ошибка: отсутствует ';' перед '{' [C:\smspp-project\cmake-build-debug\SMS++\SMS++.vcxproj] C:\smspp-project\SMS++\src\Configuration.cpp(37,1): ошибка C2447: '{': отсутствует заголовок функции (формальный список старого стиля?) [C:\smspp-project\cmake-build- отладка\SMS++\SMS++.vcxproj] C:\smspp-project\SMS++\src\Configuration.cpp(37,1): ошибка C2039: «private_name»: не является членом «глобального пространства имен» [C:\smspp-project\cmake-build- отладка\SMS++\SMS++.vcxproj] C:\smspp-project\SMS++\src\Configuration.cpp(37,1): ошибка C2988: нераспознаваемое объявление/определение шаблона [C:\smspp-project\cmake-build-debug\SMS++\SMS++.vcxproj] C:\smspp-project\SMS++\src\Configuration.cpp(37,1): ошибка C2059: синтаксическая ошибка: '}' [C:\smspp-project\cmake-build-debug\SMS++\SMS++.vcxproj] . . . Как я могу решить проблему для MSVC без псевдонима DummyBlockT< std::pair< double , int > >/code>, используя определение типа перед вызовом SMSpp_insert_in_factory_cpp_1_t? Или, если есть способ снять псевдоним с typedef, чтобы статически возвращать точное имя DummyBlockT< std::pair< double , int > >, а не имя псевдонима?
Мобильная версия