C++中的模板语法

Cry*_*tal 2 c++ templates

我真的不懂模板,并试图运行一个简单的查找最小的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'
Run Code Online (Sandbox Code Playgroud)

第三,熟悉分离.h和.cpp文件,如果我希望这个minimum()函数是我的类的静态函数,但它是该类中唯一的函数,我是否必须有一个模板类作为好?我最初尝试这样做,而不是把它全部放在一个文件中,我得到了一些编译错误,我现在不记得了,不确定我会怎么做.谢谢!

Jer*_*fin 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;
}
Run Code Online (Sandbox Code Playgroud)

但是,一般来说,这确实是错误的 - 而不是提供专业化char const *,你通常只想使用std::string,这提供了一个operator<所以你的第一个版本可以工作.