我真的不明白模板,并试图运行一个简单的查找最小的int,double,chars。
第一个问题,为什么有时会使用template<typename T>
,有时会使用template<>
?
第二个问题,我不知道下面的代码我做错了什么:
#include <iostream>
template <typename T>
T minimum(T arg1, T arg2)
{
return arg1 < arg2 ? arg1 : arg2;
}
template <typename T>
// first I tried template <> instd of above, but wasn't sure the difference
T minimum<const char *>(const char *arg1, const char *arg2)
{
return strcmp(arg1, arg2) ? arg2 : arg1;
}
int main()
{
std::cout << minimum<int>(4, 2) << '\n';
std::cout << minimum<double>(2.2, -56.7) << '\n';
std::cout << minimum(2.2, 2) << '\n';
}
Compile Errors:
error C2768: 'minimum' : illegal use of explicit template arguments
error C2783: 'T minimum(const char *,const char *)' : could not deduce template argument for 'T'
: see declaration of 'minimum'
: error C2782: 'T minimum(T,T)' : template parameter 'T' is ambiguous
: see declaration of 'minimum'
第三,在熟悉分离.h和.cpp文件时,如果我希望这个minimum()函数是我的类的静态函数,但它是该类中唯一的函数,我是否必须有一个模板类也是?我最初尝试这样做,而不是把它全部放在一个文件中,我得到了一些编译错误,我现在不记得了,不确定我会怎么做。谢谢!
答案 0 :(得分:6)
听起来你需要获得(并研究)一本涵盖模板的书 - 看起来你需要学习太多的基础知识来覆盖这里的答案。
template<>
语法用于模板特化。对于你显然想要的东西,你会做这样的事情:
template <class T>
T minimum(T const &a, T const &b) {
return a < b ? a : b;
}
template<>
char const *minimum<char const *>(char const *a, char const *b) {
return strcmp(a, b) ? a : b;
}
但是,一般来说,这确实是错误的 - 而不是为char const *
提供专业化,而通常只想使用std::string
,这提供了operator<
一个{{1}}所以你的第一个版本可行。
答案 1 :(得分:3)
看起来您的问题几乎已经回答,但您仍有一些悬而未决的问题......
std::cout << minimum(2.2, 2) << '\n';
这不会使用您提供的两个模板函数进行编译,因为没有用于调用minimum(double, int)
的匹配函数。这有两个选择:
您可以将第一个模板功能更改为:
template <typename T, typename U>
T minimum(T arg1, U arg2)
{
return arg1 < arg2 ? arg1 : arg2;
}
或
您可以更改代码以指定要调用的专业化:
std::cout << minimum<double>(2.2, 2) << '\n';
const char*
特化中也存在一个错误(一旦语法错误得到解决),因为strcmp
的归零值表示两个字符串相等。以下断言将失败:
assert(0 == strcmp("aaa", minimum("aaa", "bbb")));
这可以解决:
template <>
const char* minimum<const char*>(const char* arg1, const char* arg2)
{
return strcmp(arg1, arg2) > 0 ? arg2 : arg1;
}
答案 2 :(得分:2)
试试这个:
template <>
const char* minimum<const char *>(const char *arg1, const char *arg2)
{
return strcmp(arg1, arg2) ? arg2 : arg1;
}
答案 3 :(得分:2)
让我们解决第一个问题。您想要查看模板专业化,这是您的语法:
#include <iostream>
template <typename T>
T minimum(T arg1, T arg2)
{
return arg1 < arg2 ? arg1 : arg2;
}
template<> const char * minimum<const char *>(const char *arg1, const char *arg2)
{
return strcmp(arg1, arg2) ? arg2 : arg1;
}
int main()
{
std::cout << minimum<int>(4, 2) << '\n';
std::cout << minimum<double>(2.2, -56.7) << '\n';
std::cout << minimum(2.2, 2.0) << '\n';
}
一旦你绕过那个,我打赌你可以让其余的工作。
答案 4 :(得分:1)
您的const char *专业化不正确。你有它返回任何类型T.你的函数不支持返回const char *。基本上你不能一半专业化T或者专业或不是。如果它是专门的,那么它不应出现在模板&lt;&gt;名单。如果它不是专门的,那么它应该在模板列表中。