C++ template class compilation error message: error: expected a qualified name after 'typename'
C++ template class compilation error message: error: expected a qualified name after 'typename'
我正在尝试从 https://github.com/Sami-Vuorela/aatc
编译代码
我正在使用 LLVM em++ 编译器进行编译:
- em++: 版本 1.3.2
- clang: 版本 3.6.0
控制台错误信息如下:
/opt/emsdk_portable/emscripten/master/em++ -Qunused-arguments -U__STRICT_ANSI__ -Wall -fno-strict-aliasing -std=c++11 -DAS_WRITE_OPS=0 -DAS_USE_STLNAMES=1 -DAS_USE_FLOAT=0 -Iinclude/ -Iangelscript/sdk/angelscript/include/ -Iangelscript/sdk/add_on/scriptbuilder/ -Iangelscript/sdk/add_on/contextmgr/ -Iangelscript/sdk/add_on/scripthelper/ -Iangelscript/sdk/add_on/scriptany/ -Iangelscript/sdk/add_on/scriptstdstring/ -Iangelscript/sdk/add_on/scriptdictionary/ -Iangelscript/sdk/add_on/scriptarray/ -Iangelscript/sdk/add_on/scriptmath/ -Iangelscript/sdk/add_on/scriptgrid/ -c aatc/source/aatc_registration_tempspecs.cpp -o aatc/source/aatc_registration_tempspecs.o
In file included from aatc/source/aatc_registration_tempspecs.cpp:40:
In file included from aatc/source/aatc_tempspecs.hpp:37:
aatc/source/aatc_shared_tempspec.hpp:52:11: error: expected a qualified name after 'typename'
typename typedef T_container::iterator iteratortype;
^
aatc/source/aatc_shared_tempspec.hpp:52:11: error: expected member name or ';' after declaration specifiers
typename typedef T_container::iterator iteratortype;
^
aatc/source/aatc_shared_tempspec.hpp:97:18: error: cannot specialize a function 'Push_Back' within class scope
template<> void Push_Back<aatc_Y>(const T_content& value){
^
aatc/source/aatc_shared_tempspec.hpp:101:18: error: cannot specialize a function 'Pop_Back' within class scope
template<> void Pop_Back<aatc_Y>(){
^
aatc/source/aatc_shared_tempspec.hpp:106:25: error: cannot specialize a function 'Register_func_back_write' within
class scope
template<> static void Register_func_back_write<aatc_Y>(asIScriptEngine* engine, int& r, char* text...
^
aatc/source/aatc_shared_tempspec.hpp:114:24: error: cannot specialize a function 'Back' within class scope
template<> T_content& Back<aatc_Y>(){
^
aatc/source/aatc_shared_tempspec.hpp:119:25: error: cannot specialize a function 'Register_func_back_read' within
class scope
template<> static void Register_func_back_read<aatc_Y>(asIScriptEngine* engine, int& r, char* textb...
^
aatc/source/aatc_shared_tempspec.hpp:126:18: error: cannot specialize a function 'Push_Front' within class scope
template<> void Push_Front<aatc_Y>(const T_content& value){
^
aatc/source/aatc_shared_tempspec.hpp:130:18: error: cannot specialize a function 'Pop_Front' within class scope
template<> void Pop_Front<aatc_Y>(){
^
aatc/source/aatc_shared_tempspec.hpp:135:25: error: cannot specialize a function 'Register_func_front_write' within
class scope
template<> static void Register_func_front_write<aatc_Y>(asIScriptEngine* engine, int& r, char* tex...
^
aatc/source/aatc_shared_tempspec.hpp:143:24: error: cannot specialize a function 'Front' within class scope
template<> T_content& Front<aatc_Y>(){
^
aatc/source/aatc_shared_tempspec.hpp:148:25: error: cannot specialize a function 'Register_func_front_read' within
class scope
template<> static void Register_func_front_read<aatc_Y>(asIScriptEngine* engine, int& r, char* text...
^
aatc/source/aatc_shared_tempspec.hpp:167:18: error: cannot specialize a function 'Erase_value' within class scope
template<> void Erase_value<aatc_Y>(const T_content& value){
^
aatc/source/aatc_shared_tempspec.hpp:172:25: error: cannot specialize a function 'Register_func_erase_value' within
class scope
template<> static void Register_func_erase_value<aatc_Y>(asIScriptEngine* engine, int& r, char* tex...
^
aatc/source/aatc_shared_tempspec.hpp:180:24: error: cannot specialize a function 'op_index' within class scope
template<> T_content& op_index<aatc_Y>(aatc_type_sizetype index){
^
aatc/source/aatc_shared_tempspec.hpp:186:25: error: cannot specialize a function 'Register_func_op_index' within
class scope
template<> static void Register_func_op_index<aatc_Y>(asIScriptEngine* engine, int& r, char* textbu...
^
aatc/source/aatc_shared_tempspec.hpp:192:18: error: cannot specialize a function 'Reserve' within class scope
template<> void Reserve<aatc_Y>(aatc_type_sizetype count){
^
aatc/source/aatc_shared_tempspec.hpp:197:25: error: cannot specialize a function 'Register_func_reserve' within
class scope
template<> static void Register_func_reserve<aatc_Y>(asIScriptEngine* engine, int& r, char* textbuf...
^
aatc/source/aatc_shared_tempspec.hpp:203:18: error: cannot specialize a function 'Insert' within class scope
template<> void Insert<aatc_Y>(const T_content& value){
^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
我该如何解决这个问题?
typename
和typedef
的顺序颠倒了,应该是:
typedef typename T_container::iterator iteratortype;
那是因为typename
修饰了限定名T_container::iterator
,整个修饰的东西就是typedef
的主题。
其他大量错误是不言自明的:代码显然包含在 class 中声明的模板特化,这不是合法的 C++。所以不是这样的:
class X
{
template <class T>
void Erase_value(const T_content& value);
template <>
void Erase_value<aatc_Y>(const T_content& value){ /* ... */ }
};
一定是这样的:
class X
{
template <class T>
void Erase_value(const T_content& value);
};
template <>
void X::Erase_value<aatc_Y>(const T_content& value){ /* ... */ }
我正在尝试从 https://github.com/Sami-Vuorela/aatc
编译代码我正在使用 LLVM em++ 编译器进行编译:
- em++: 版本 1.3.2
- clang: 版本 3.6.0
控制台错误信息如下:
/opt/emsdk_portable/emscripten/master/em++ -Qunused-arguments -U__STRICT_ANSI__ -Wall -fno-strict-aliasing -std=c++11 -DAS_WRITE_OPS=0 -DAS_USE_STLNAMES=1 -DAS_USE_FLOAT=0 -Iinclude/ -Iangelscript/sdk/angelscript/include/ -Iangelscript/sdk/add_on/scriptbuilder/ -Iangelscript/sdk/add_on/contextmgr/ -Iangelscript/sdk/add_on/scripthelper/ -Iangelscript/sdk/add_on/scriptany/ -Iangelscript/sdk/add_on/scriptstdstring/ -Iangelscript/sdk/add_on/scriptdictionary/ -Iangelscript/sdk/add_on/scriptarray/ -Iangelscript/sdk/add_on/scriptmath/ -Iangelscript/sdk/add_on/scriptgrid/ -c aatc/source/aatc_registration_tempspecs.cpp -o aatc/source/aatc_registration_tempspecs.o
In file included from aatc/source/aatc_registration_tempspecs.cpp:40:
In file included from aatc/source/aatc_tempspecs.hpp:37:
aatc/source/aatc_shared_tempspec.hpp:52:11: error: expected a qualified name after 'typename'
typename typedef T_container::iterator iteratortype;
^
aatc/source/aatc_shared_tempspec.hpp:52:11: error: expected member name or ';' after declaration specifiers
typename typedef T_container::iterator iteratortype;
^
aatc/source/aatc_shared_tempspec.hpp:97:18: error: cannot specialize a function 'Push_Back' within class scope
template<> void Push_Back<aatc_Y>(const T_content& value){
^
aatc/source/aatc_shared_tempspec.hpp:101:18: error: cannot specialize a function 'Pop_Back' within class scope
template<> void Pop_Back<aatc_Y>(){
^
aatc/source/aatc_shared_tempspec.hpp:106:25: error: cannot specialize a function 'Register_func_back_write' within
class scope
template<> static void Register_func_back_write<aatc_Y>(asIScriptEngine* engine, int& r, char* text...
^
aatc/source/aatc_shared_tempspec.hpp:114:24: error: cannot specialize a function 'Back' within class scope
template<> T_content& Back<aatc_Y>(){
^
aatc/source/aatc_shared_tempspec.hpp:119:25: error: cannot specialize a function 'Register_func_back_read' within
class scope
template<> static void Register_func_back_read<aatc_Y>(asIScriptEngine* engine, int& r, char* textb...
^
aatc/source/aatc_shared_tempspec.hpp:126:18: error: cannot specialize a function 'Push_Front' within class scope
template<> void Push_Front<aatc_Y>(const T_content& value){
^
aatc/source/aatc_shared_tempspec.hpp:130:18: error: cannot specialize a function 'Pop_Front' within class scope
template<> void Pop_Front<aatc_Y>(){
^
aatc/source/aatc_shared_tempspec.hpp:135:25: error: cannot specialize a function 'Register_func_front_write' within
class scope
template<> static void Register_func_front_write<aatc_Y>(asIScriptEngine* engine, int& r, char* tex...
^
aatc/source/aatc_shared_tempspec.hpp:143:24: error: cannot specialize a function 'Front' within class scope
template<> T_content& Front<aatc_Y>(){
^
aatc/source/aatc_shared_tempspec.hpp:148:25: error: cannot specialize a function 'Register_func_front_read' within
class scope
template<> static void Register_func_front_read<aatc_Y>(asIScriptEngine* engine, int& r, char* text...
^
aatc/source/aatc_shared_tempspec.hpp:167:18: error: cannot specialize a function 'Erase_value' within class scope
template<> void Erase_value<aatc_Y>(const T_content& value){
^
aatc/source/aatc_shared_tempspec.hpp:172:25: error: cannot specialize a function 'Register_func_erase_value' within
class scope
template<> static void Register_func_erase_value<aatc_Y>(asIScriptEngine* engine, int& r, char* tex...
^
aatc/source/aatc_shared_tempspec.hpp:180:24: error: cannot specialize a function 'op_index' within class scope
template<> T_content& op_index<aatc_Y>(aatc_type_sizetype index){
^
aatc/source/aatc_shared_tempspec.hpp:186:25: error: cannot specialize a function 'Register_func_op_index' within
class scope
template<> static void Register_func_op_index<aatc_Y>(asIScriptEngine* engine, int& r, char* textbu...
^
aatc/source/aatc_shared_tempspec.hpp:192:18: error: cannot specialize a function 'Reserve' within class scope
template<> void Reserve<aatc_Y>(aatc_type_sizetype count){
^
aatc/source/aatc_shared_tempspec.hpp:197:25: error: cannot specialize a function 'Register_func_reserve' within
class scope
template<> static void Register_func_reserve<aatc_Y>(asIScriptEngine* engine, int& r, char* textbuf...
^
aatc/source/aatc_shared_tempspec.hpp:203:18: error: cannot specialize a function 'Insert' within class scope
template<> void Insert<aatc_Y>(const T_content& value){
^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
我该如何解决这个问题?
typename
和typedef
的顺序颠倒了,应该是:
typedef typename T_container::iterator iteratortype;
那是因为typename
修饰了限定名T_container::iterator
,整个修饰的东西就是typedef
的主题。
其他大量错误是不言自明的:代码显然包含在 class 中声明的模板特化,这不是合法的 C++。所以不是这样的:
class X
{
template <class T>
void Erase_value(const T_content& value);
template <>
void Erase_value<aatc_Y>(const T_content& value){ /* ... */ }
};
一定是这样的:
class X
{
template <class T>
void Erase_value(const T_content& value);
};
template <>
void X::Erase_value<aatc_Y>(const T_content& value){ /* ... */ }