- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是示例代码(第 700 页,来自 Forouzan 和 Gilberg 的 C++ 编程:一种面向对象的方法。
据我了解,它是为了解释函数模板特化
,而且我已经阅读并看到很多人说要避免这种情况以支持重载
, traits class
(不管是什么),我想还有其他方法——所以我不打算花太多时间在上面,但我想学习它。 @Roger Pate 通过这个很好的链接提供了一个答案,我仍在吸收这个链接(在下面类似问题的链接中):http://www.gotw.ca/publications/mill17.htm
1 #include <iostream>
2 #include <string>
3 #include <cstring>
4 using namespace std;
5
6 // Template Function
7 template <typename T>
8 T smaller(const T& first, const T& second)
9 {
10 if (first < second)
11 {
12 return first;
13 }
14 return second;
15 }
16
17 // Specialization of template function (previously defined)
18 // a C-style string is of type: const char*
19 // so replace every "T" with that
20 template <>
21 const char* smaller (const (const char*) & first, const (const char*) & second)
22 //const char* smaller<>(const (const char*)& first, const (const char*)& second)
23 //const char* smaller<const char*>(const (const char*)& first, const (const char*)& second)
24 {
25 if (strcmp (first, second ) < 0)
26 {
27 return first;
28 }
29 return second;
30 }
31
32 int main ( )
33 {
34
35 // Calling template with two string objects
36 string str1 = "Hello";
37 string str2 = "Hi";
38 cout << "Smaller (Hello , Hi): " << smaller (str1, str2) << endl;
39
40 //Calling template function with two C-string objects
41 const char* s1 = "Bye";
42 const char* s2 = "Bye Bye";
43 cout << "Smaller (Bye, Bye Bye)" << smaller (s1, s2) << endl;
44 // cout << "Smaller (Bye, Bye Bye)" << smaller<>(s1, s2) << endl;
45 // cout << "Smaller (Bye, Bye Bye)" << smaller<const char*>(s1, s2) << endl;
46
47 return 0;
48 }
49
50
51 /*
52 The operator < is not defined for a C-style string, meaning we cannot use the template
53 function to find the smaller of the two C-style strings.
54 This operator is defined in the library "string", and so overloads the operator
55 */
相同的代码,没有行号和我失败的尝试:
/***************************************************************
* Template function definition with specialization *
***************************************************************/
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
// Template Function
template <typename T>
T smaller (const T& first, const T& second)
{
if (first < second)
{
return first;
}
return second;
}
// Specialization of template function
template <>
const char* smaller (const (const char*) & first, const (const char*) & second)
{
if (strcmp (first, second ) < 0)
{
return first;
}
return second;
}
int main ( )
{
// Calling template with two string objects
string str1 = "Hello";
string str2 = "Hi";
cout << "Smaller (Hello , Hi): " << smaller (str1, str2) << endl;
//Calling template function with two C-string objects
const char* s1 = "Bye";
const char* s2 = "Bye Bye";
cout << "Smaller (Bye, Bye Bye)" << smaller (s1, s2) << endl;
return 0;
}
长话短说,我的编译器gcc-8
,
2120|1|root@sbh ~/CODING/CppTemplate # Sun 11 08 2019, 08:53:15
/usr/bin/gcc-8 --version
gcc-8 (Debian 8.3.0-19) 8.3.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
无论我尝试修复(如下)如何,始终抛出此输出。
2122|1|root@sbh ~/CODING/CppTemplate # Sun 11 08 2019, 08:56:33
g++-8 -Wall -O -std=c++2a templateSpecialization.cpp -o templateSpecialization.out
templateSpecialization.cpp:21:42: error: ISO C++ forbids declaration of ‘parameter’ with no type [-fpermissive]
const char* smaller (const (const char*) & first, const (const char*) & second)
^
templateSpecialization.cpp:21:44: error: expected ‘,’ or ‘...’ before ‘first’
const char* smaller (const (const char*) & first, const (const char*) & second)
^~~~~
templateSpecialization.cpp:21:13: error: template-id ‘smaller<>’ for ‘const char* smaller(const int (*)(const char*))’ does not match any template declaration
const char* smaller (const (const char*) & first, const (const char*) & second)
^~~~~~~
templateSpecialization.cpp:8:3: note: candidate is: ‘template<class T> T smaller(const T&, const T&)’
T smaller(const T& first, const T& second)
^~~~~~~
我注意到这个问题,它的答案具有相同的功能精神,Function template specialization importance and necessity通过 https://stackoverflow.com/users/124797/jagannath @jagannath;
template<typename T>
bool Less(T a, T b)
{
cout << "version 1 ";
return a < b;
}
// Function templates can't be partially specialized they can overload instead.
template<typename T>
bool Less(T* a, T* b)
{
cout << "version 2 ";
return *a < *b;
}
template<>
bool Less<>(const char* lhs, const char* rhs)
{
cout << "version 3 ";
return strcmp(lhs, rhs) < 0;
}
int a = 5, b = 6;
cout << Less<int>(a, b) << endl;
cout << Less<int>(&a, &b) << endl;
cout << Less("abc", "def") << endl;
似乎我正在对我的函数模板
做所有相同的修改,例如将每个“T”替换为“const char*”,例如第 22 和 23 行。
我阅读了一些关于编译器“推导”使用什么的内容,所以我尝试在调用中在函数名称之后添加方括号(第 44 和 45 行)。
我敢肯定这很简单,可能在其他地方也有介绍,但我找不到它。甚至可能是在类模板上下文中的解释,但我刚刚开始学习模板,这是我所了解的(即那本书中的第 700 页)。
连这个问题Function Template Specialization Error似乎有类似的问题 does not match any template declaration
但同样,我觉得我已经遵循了模式,如第 21 行(作者的)以及我的第 22 和 23 行。
附言:我认为这无关紧要,但我的环境可能有点奇怪......
最佳答案
尝试将类型定义为:
template <>
const char* smaller (const char* const &first , const char* const &second);
或者:
using cstring_t = const char*;
template <>
const char* smaller (const cstring_t& first, const cstring_t& second);
对于第一种情况,const char* const &
,如果使用“east const”表示法:
char const * const &
您可以从右到左阅读:“对指向常量 char 的常量指针的引用”。不需要括号。
第二个示例显示了一个更清晰的示例,如果您不想混淆类型的话。两个函数签名都解析为同一类型。
关于c++ - 函数模板特化 - 错误 - ISO C++ 禁止声明没有类型的 ‘parameter’,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57451280/
我是 python 的新手。我试图找到我的文本的频率分布。这是代码, import nltk nltk.download() import os os.getcwd() text_file=open(
我对安卓 fragment 感到困惑。我知道内存 fragment 但无法理解什么是 android fragment 问题。虽然我发现很多定义,比如 Android fragmentation re
尝试对 WordPress 进行 dockerise 我发现了这个场景: 2个数据卷容器,一个用于数据库(bbdd),另一个用于wordpress文件(wordpress): sudo docker
这个问题已经有答案了: From the server is there a way to know that my page is being loaded in an Iframe (1 个回答)
我正在玩小型服务器,试图对运行在其上的服务进行docker化。为简化起见,假设我必须主要处理:Wordpress和另一项服务。 在Docker集线器上有许多用于Wordpress的图像,但是它们似乎都
我想要发生的是,当帐户成功创建后,提交的表单应该消失,并且应该出现一条消息(取决于注册的状态)。 如果成功,他们应该会看到一个简单的“谢谢。请检查您的电子邮件。” 如果不是,那么他们应该会看到一条适当
就是这样,我需要为客户添加一个唯一标识符。通过 strip 元数据。这就是我现在完全构建它的方式,但是我只有最后一部分告诉我用户购买了哪个包。 我试着看这里: Plans to stripe 代码在这
我有一个类将执行一些复杂的操作,涉及像这样的一些计算: public class ComplexAction { public void someAction(String parameter
这个问题已经有答案了: maven add a local classes directory to module's classpath (1 个回答) 已关闭10 年前。 我有一些不应更改的旧 E
我使用 fragment 已经有一段时间了,但我经常遇到一个让我烦恼的问题。 fragment 有时会相互吸引。现在,我设法为此隔离了一个用例,它是这样的: Add fragment A(也使用 ad
我的 html 中有一个 ol 列表,上面有行条纹。看起来行条纹是从数字后面开始的。有没有办法让行条纹从数字开始? 我已经包含了正在发生的事情的片段 h4:nth-child(even) {
如何仅使用 css 将附加图像 html 化? 如果用纯 css 做不到,那我怎么能至少用一个图像来做 最佳答案 这不是真正的问题,而是您希望我们为您编写代码。我建议您搜索“css breadcrum
以下是 Joshua 的 Effective Java 的摘录: If you do synchronize your class internally, you can use various te
在这里工作时,我们有一个框向业务合作伙伴提供 XML 提要。对我们的提要的请求是通过指定查询字符串参数和值来定制的。其中一些参数是必需的,但很多不是。 例如,我们要求所有请求都指定一个 GUID 来标
我有 3 个缓冲区,其中包含在 32 位处理器上运行的 R、G、B 位数据。 我需要按以下方式组合三个字节: R[0] = 0b r1r2r3r4r5r6r7r8 G[0] = 0b g1g2g3g4
我最近发现了关于如何使用 History.js、jQuery 和 ScrollTo 通过 HTML5 History API 对网站进行 Ajax 化的要点:https://github.com/br
我们有一个 Spring Boot 应用程序,由于集成需要,它变得越来越复杂——比如在你这样做之后发送一封电子邮件,或者在你之后广播一条 jms 消息等等。在寻找一些更高级别的抽象时,我遇到了 apa
我正在尝试首次实施Google Pay。我面临如何指定gateway和gatewayMarchantId的挑战。 我所拥有的是google console帐户,不知道在哪里可以找到此信息。 priva
昨天下午 3 点左右,我为两个想要从一个 Azure 帐户转移到另一个帐户的网站设置了 awverify 记录。到当天结束时,Azure 仍然不允许我添加域,所以我赌了一把,将域和 www 子域重新指
我正在使用terms facet在elasticsearch服务器中获取顶级terms。现在,我的标签"indian-government"不被视为一个标签。将其视为"indian" "governm
我是一名优秀的程序员,十分优秀!