Здесь происходит пара вещей.Самый ближайший из них, который вы включили, объявляет pow
или std::pow
.Как бы мне ни хотелось обвинять все это в using namespace std;
, хорошая старая функция C pow
достаточно хороша, чтобы сорвать компилятор.Компилятор находит два pow
с достаточно похожими параметрами и не знает, какой из них использовать.Вместо этого назовите вашу функцию mypow
или поместите ее в собственное пространство имен.
Например: func.cpp
namespace my
{
double pow(double x, int y)
{
// guts of pow are unchanged
}
}
и в source.cpp
double pow(double x, int y);
становится
namespace my
{
double pow(double x, int y);
}
и называется
answer = my::pow(x, y);
Это решает проблему 1.
Проблема 2 - это проблема компоновщика, которую вы еще не видели.В вашем проекте func.cpp будет скомпилирован в func.obj.func.cpp также включен в source.cpp.Включенная функция эффективно вставляется во включаемый файл, так что теперь у вас есть две копии всего в func, который компилируется.pow
можно найти внутри func.obj и source.obj.
Это становится проблемой, когда компоновщик пытается собрать func.obj и source.obj в один исполняемый файл.компоновщик находит два pow
s и, как и компилятор, не знает, какой из них использовать.
Стандартное правило - не включать файлы cpp.Пусть компилятор скомпилирует их, а компоновщик скомпонует их.Создайте заголовок, который отображает функции в файле cpp, которые необходимо использовать извне, и пусть пользователи включают заголовок.
Это делает вашу программу похожей на
func.h
#pragma once
namespace my
{
double pow(double x, int y);
}
func.cpp
namespace my
{
double pow(double x, int y)
{
double result = 1;
if (x == 0 && y == 0)
{
result = -1;
}
else
{
if (y == 0)
{
result = 1;
}
else if (y < 0)
{
x = 1.0 / x;
y *= -1;
}
for (int i = 0; i < y; i++)
{
result *= x;
}
}
return result;
}
}
source.cpp
#include <iostream>
#include <string>
#include "func.h"
using namespace std;
int main()
{
double x;
int y;
double answer;
cout << "Choose a number: " << endl;
cin >> x;
cout << "Raised to the power: " << endl;
cin >> y;
answer = my::pow(x, y);
cout << "Answer: " << answer << endl;
return answer;
}
Не имеет отношения, но хорошо читается: Почему "использование пространства имен std" считается плохой практикой?