C ++函数调用失败

时间:2018-05-28 17:14:46

标签: c++

声明函数时出现以下错误:

Users/masterprogrammer/PycharmProjects/WolvesBatsRocks/c++/c++example.cpp:23:5: error: no matching function for call to 'printstats'
    printstats(&x, y);
    ^~~~~~~~~~
/Users/masterprogrammer/PycharmProjects/WolvesBatsRocks/c++/c++example.cpp:10:6: note: candidate function not viable: no known conversion from 'const std::string *' (aka 'const basic_string<char, char_traits<char>, allocator<char> > *') to 'const std::string' (aka 'const basic_string<char, char_traits<char>, allocator<char> >') for 1st argument; remove &
void printstats(const std::string& x, int statnum);
     ^
/Users/masterprogrammer/PycharmProjects/WolvesBatsRocks/c++/c++example.cpp:12:6: note: candidate function not viable: no known conversion from 'const std::string *' (aka 'const basic_string<char, char_traits<char>, allocator<char> > *') to 'char *' for 1st argument
void printstats(char * x, int stat_num)
     ^
1 error generated.
[Finished in 0.9s with exit code 1]
[shell_cmd: g++ "/Users/masterprogrammer/PycharmProjects/WolvesBatsRocks/c++/c++example.cpp" -o "/Users/masterprogrammer/PycharmProjects/WolvesBatsRocks/c++/c++example" && "/Users/masterprogrammer/PycharmProjects/WolvesBatsRocks/c++/c++example"]
[dir: /Users/masterprogrammer/PycharmProjects/WolvesBatsRocks/c++]
[path: /anaconda3/bin:/Library/Frameworks/Python.framework/Versions/3.6/bin:/Library/Frameworks/Python.framework/Versions/3.5/bin:/Library/Frameworks/Python.framework/Versions/3.6/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin]

该函数有两个输入,我从main调用它。 我期待输出具有以下格式Strength: 7。 这是代码:

// C program to illustrate
// call by value
#include <stdio.h>
#include <iostream> 
#include <ctime>    // For time()
#include <cstdlib>  // For srand() and rand()
#include <string>
#include <cstring>

void printstats(const std::string& x, int statnum);

void printstats(char * x, int stat_num)
{
    printf("%s: %d", x, stat_num);
}

int main(void)
{
    const std::string&x = "Strength";
    int y = 7;

    // Passing parameters
    printstats(&x, y);

    return 0;
}

3 个答案:

答案 0 :(得分:2)

您的函数原型void printstats(const std::string& x, int statnum)和函数定义void printstats(char * x, int stat_num)需要不同的参数。

一个人希望const string &作为第一个参数,另一个人希望char *作为第一个参数。

将两者更改为具有相同的参数,并确保函数调用将适当的参数传递给函数。

答案 1 :(得分:1)

您无法定义地址类型,但您可以传递其他变量的地址,我认为这两个变量都不是您的目标。

&安培;方法签名意味着通过引用调用,这基本上意味着在函数内部使用引用来访问调用中使用的实际参数。 要使其工作,请定义string并直接传递它。

std::string x= "Strength";
int y = 7;

printstats(x, y);

答案 2 :(得分:1)

你真的需要阅读一本好的入门C ++书。看来你从C书中拿了一个例子,试图在C ++中使用它而不了解正在发生的事情。

我删除了不必要的包含:

#include <stdio.h>
#include <string>

//Use a reference to string object instead of char pointer
void printstats(const std::string& x, int stat_num)
{
    //printf is a C function that expects a C char* straing,
    //so we need to convert the C++ string into it
    printf("%s: %d", x.c_str(), stat_num);
}

int main(void)
{
    //no need for "&" here - it's totally incorrect.
    //It is an operation of taking an address of a variable.
    const std::string x = "Strength";
    int y = 7;

    //no need for & here too
    printstats(x, y);

    return 0;
}

输出:

  

力量:7