C ++模板函数解析

时间:2016-11-08 23:22:55

标签: templates g++ clang template-specialization clang++

我有以下示例代码,并希望得到一些帮助,以了解为什么我无法在Linux上使用clang和g ++编译它?

#include <iostream>

using namespace std;

typedef enum COLORS {
    RED = 0,
    GREEN,
    BLUE,
    ORANGE,
    MAROON,
    WHITE,
    BLACK
} COLORS;

template <COLORS C> void whatColor( COLORS x ) {
    cout << "this can be any color!!!" << endl;
}

template<> void whatColor<RED>( COLORS x ) {
    cout << "this is RED!!!" << endl;
}

template<> void whatColor<GREEN>( COLORS x ) {
    cout << "this is GREEN!!!" << endl;
}

template<> void whatColor<BLUE>( COLORS x ) {
    cout << "this is BLUE!!!" << endl;
}

template<> void whatColor<ORANGE>( COLORS x ) {
    cout << "this is ORANGE!!!" << endl; 
}

int main( ) {
    const COLORS red=RED;

    whatColor( red );
    whatColor<RED>( RED );
    whatColor<red>( red );
    whatColor<RED>( red );
}

我看到的失败是:

CXX [misc]  tmpl.cpp
src/tmpl.cpp:40:2: error: no matching function for call to 'whatColor'
    whatColor( red );
    ^~~~~~~~~
src/tmpl.cpp:15:26: note: candidate template ignored: couldn't infer template argument 'C'
template <COLORS C> void whatColor( COLORS x ) {
                     ^
1 error generated.
make: *** [obj/tmpl.o] Error 1

我不清楚为什么在这种情况下无法推断出论证类型

1 个答案:

答案 0 :(得分:0)

代码:

template <COLORS C> void whatColor( COLORS x ){...}

你定义了一个模板函数,在模型Color的值C上模板化,这个函数也巧合地将Color x作为参数(实际上并没有使用)

然后,您还将该函数专门用于C的某些可能值。

致电

whatColor( red );

您正在为Color x提供一个值,但不是C的值。由于X和C不相关(即使它们都是颜色),编译器也无法决定什么值使用C语言。

您应该决定是否要在动作或静态类型中对颜色进行动态或静态类型(在编译时是否修复),此时代码会尝试混合使用

例如,目前可以像这样调用它

whatColor<RED>( BLUE );

真的有点奇怪。 C = RED,X = BLUE(但忽略X)

如果要在编译时修复颜色,可以删除X函数参数并只使用C模板参数

template <COLORS C> void whatColor() //definition
whatColor<RED>(); // call

或者如果您希望函数使用X参数,则不要使用模板

void whatColor(COLORS X)
{
    // maybe use a switch statement on X
}

如果不同的颜色是不同的类型而不是值,那么重载或模板代码就可以工作(不是我推荐的)

class Red{};
class Blue{};
template <typename COLORSTYPE> void whatColor( COLORSTYPE x )
{ 
   // ...
}

//或重载

void whatColor(Red dummy){//...}
void whatColor(Blue dummy){//...}

Red red;
whatColor(red);