我有以下示例代码,并希望得到一些帮助,以了解为什么我无法在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
我不清楚为什么在这种情况下无法推断出论证类型
答案 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);