Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 理解c++;Webkit中使用的模板代码_C++_Templates_Webkit - Fatal编程技术网

C++ 理解c++;Webkit中使用的模板代码

C++ 理解c++;Webkit中使用的模板代码,c++,templates,webkit,C++,Templates,Webkit,我正在寻找和 在第196行的标题中,有一段代码 template <bool shouldBuildIdentifiers> ALWAYS_INLINE JSTokenType parseIdentifier(JSTokenData*, unsigned lexerFlags, bool strictMode); 模板始终\u内联JSTokenType parseIdentifier(JSTokenData*,无符号lexerFlags,bool strictMode); 我可以

我正在寻找和
在第196行的标题中,有一段代码

template <bool shouldBuildIdentifiers> ALWAYS_INLINE JSTokenType parseIdentifier(JSTokenData*, unsigned lexerFlags, bool strictMode);
模板始终\u内联JSTokenType parseIdentifier(JSTokenData*,无符号lexerFlags,bool strictMode);
我可以在cpp文件中看到它的一个实现,如下所示

template <>
template <bool shouldCreateIdentifier> ALWAYS_INLINE JSTokenType Lexer<LChar>::parseIdentifier(JSTokenData* tokenData, unsigned lexerFlags, bool strictMode)
模板
模板始终\u内联JSTokenType Lexer::parseIdentifier(JSTokenData*tokenData,无符号lexerFlags,bool strictMode)
我对语法的理解是,我们正在定义/专门化LChar类型Lexer的函数。这是正确的吗? 我读到()这在理想情况下应该在头文件中完成


<旧的C++编译器是否支持这种语法?我的是mips-linux-g++v4.1.0。我得到一个“模板id不匹配任何模板声明”

您的理解是正确的。bool仍然允许在方法的模板上变化,专门化是针对类的

虽然模板通常是专门化的,并在头文件中实现,但另一种方法是为专门化添加一个正向声明,编译器将找到它。但是,实现必须从另一个文件链接,就像具有单独声明和定义的任何其他函数一样。这样做的缺点是没有链接时间优化就不会进行内联,但好处是无论何时使用模板,都需要解析的代码要少得多。在大型项目中,这可以显著提高编译时间

在本例中,该类的实现者已经决定,实际上只有两种方法可以实例化该类,使用LChar和UChar(参见第1930行的注释)。因此,他们可以将其实现放在.cpp文件中,通过在文件底部实例化两个模板,在该阶段解决所有问题

模板可以用来实现完全通用的类(如
std::vector
),这些类期望任何东西,但当您认为不太可能需要更多的实现才能从代码重用中获益时,也可以用来代替虚拟方法


至于g++4.1.0,我刚刚检查了一下,发现它已经有将近9年的历史了!从那时起,与模板相关的问题就得到了解决,如果你对模板做了一些非琐碎的事情,那么确实值得尝试升级。

“bool仍然允许在方法的模板上变化,专门化是针对类的。”这意味着什么?返回类型是bool吗?在这种情况下,总共有两个模板参数。一个应用于类(模板类Lexer中的
T
),第二个应用于方法(bool shouldCreateIdentifier)。我们正在将
T
设置为
LChar
,但仍让
shouldCreateIdentifier
取不同的值。这也被称为部分专门化。这是否意味着shouldCreateIdentifier可以有bool以外的类型?不,它必须是
bool
。模板参数可以是typename,也可以是整型/枚举。还有一些很少使用的,因为血淋淋的细节)。在这里,
bool
实际上是一个整数类型,唯一允许的值是
true
false
。另一个您更常见的模板是模板模板,它是<代码> STD::数组< /Cord>给出了编译器支持C++特性的详细信息。