使用模板进行功能时出错

时间:2015-04-18 18:49:31

标签: c++ templates types

我想创建一个函数,为不同的输入字符串返回不同类型的数据类型。我正在使用模板,但似乎我犯了一些错误。

template<typename S>
S select(string type){

int integer;
float floaty;
char character;
string strings;

if(type=="int")
    return integer;

if(type=="char")
    return character;

if(type=="float")
    return floaty;

if(type=="string")
    return strings;
}

当我运行它时会出现这个错误,这将是字符串参数int。

    sam.cpp:771:13: error: no matching function for call to ‘select(std::string&)’
  select(type);
             ^
sam.cpp:771:13: note: candidates are:
In file included from /usr/include/x86_64-linux-gnu/sys/types.h:219:0,
                 from /usr/include/stdlib.h:314,
                 from Markup.h:12,
                 from sam.cpp:3:
/usr/include/x86_64-linux-gnu/sys/select.h:106:12: note: int select(int, fd_set*, fd_set*, fd_set*, timeval*)
 extern int select (int __nfds, fd_set *__restrict __readfds,
            ^
/usr/include/x86_64-linux-gnu/sys/select.h:106:12: note:   candidate expects 5 arguments, 1 provided
sam.cpp:17:3: note: template<class S> S select(std::string)
 S select(string type){
   ^
sam.cpp:17:3: note:   template argument deduction/substitution failed:
sam.cpp:771:13: note:   couldn't deduce template parameter ‘S’
  select(type);

如果这是错误的方式并且有更好的做事方式,那就分享吧,谢谢。

2 个答案:

答案 0 :(得分:3)

在C ++模板中,类型推导是基于参数而不是返回类型,因此,在您的特定情况下,当您调用函数select时,您必须显式指定模板参数。

  那么我将如何实现我想用这个功能做什么呢?

使用模板专业化。

template<typename S>
S select(){
static_assert("Not Implemented");
}

template<> int select<int>() {
    int integer;
    //To Do
    return integer;
}

template<> float select<float >() {
    float floaty;
    //To Do
    return floaty;
}
//Remaining Specialization

并使用显式模板参数

调用相应的专门化
int main()
{
    int _integer = select<int>();
    float _float = select<float>();
    ..........
}

答案 1 :(得分:0)

这不可行。模板需要在编译时知道它们的参数,但type的值仅在运行时已知。

如果Sint,则return strings无法编译,但如果Sstring,则return integer赢了&#39 ; t编译。

正如其他人指出的那样S无法推断出来,所以你必须在调用中明确指定它。但由于上述原因,它仍无法发挥作用。

(除此之外,你还没有初始化任何值。)