C ++ template-id与任何模板都不匹配?

时间:2017-01-20 05:21:49

标签: c++ templates

我用模板和专业化写了一个简单的代码:

#include <iostream>

template <class T>
int HelloFunction(const T& a)
{
    std::cout << "Hello: " << a << std::endl;
    return 0;
}

template <>
int HelloFunction(const char* & a)
{
    std::cout << "Hello: " << a << std::endl;
    return 0;
}

int main()
{
    HelloFunction(1);
    HelloFunction("char");

    return 0;
}

我认为char *专业化是正确的,但是g ++报告:

D:\work\test\HelloCpp\main.cpp:11:5: 
error: template-id 'HelloFunction<>' for 'int HelloFunction(const char*&)' does not match any template declaration

请帮我找到错误。

2 个答案:

答案 0 :(得分:3)

功能模板可以完全专业化,不能部分专业化,这是事实 也就是说,大多数情况下,重载工作正常,您根本不需要任何专业化:

#include <iostream>

template <class T>
int HelloFunction(const T &a) {
    std::cout << "Hello: " << a << std::endl;
    return 0;
}

int HelloFunction(const char *a) {
    std::cout << "Hello: " << a << std::endl;
    return 0;
}

int main() {
    HelloFunction(1);
    HelloFunction("char");
    return 0;
}

非模板函数(假设)首选超过函数模板,因此您可以使用旧的普通函数轻松获得代码所支付的费用。

答案 1 :(得分:1)

您无法使用模板专精来进行功能重载。如果这是你想做的事。

模板专门化用于专门化对象而不是裸功能。可能你可以改变你这样的代码来做你想做的事。

template<typename T>
struct ABC {
    T type;
    ABC(T inType) : type(inType) {}
};

template <class T>
int HelloFunction(ABC<T>& a)
{
    std::cout << "Hello: " << a.type << std::endl;
    return 0;
}

template <>
int HelloFunction(ABC<const char*> & a)
{
    std::cout << "Hello: " << a.type << std::endl;
    return 0;
}

int main()
{
    HelloFunction(ABC<int>(1));
    HelloFunction(ABC<const char*>("char"));

    return 0;
}

从上面的代码中可以看出,您使用ABC的专门化并在函数HelloFunction中使用相同的