Проблема
Я новичок в C ++, и я делаю домашнюю работу, которая отображает различные дистрибутивы в консоли, но мой проект не будет компилироваться.Когда у меня все было в одном файле, все работало нормально и прекрасно, но мой профессор хочет, чтобы мы разбили вещи на файл hpp, файл cpp и основной файл.Я просто переместил все, и теперь он не будет компилироваться из-за ошибки дублирования символов.
Определение против декларации
Я понимаю, что вы хотите включить только объявления функций в ваш заголовочный файл, поэтому я добавил их, но сохранил фактические определения функций в файле cpp.У меня есть оператор include в файле cpp, который включает в себя файл заголовка, и еще один в main.cpp, который включает файл cpp.
Я понимаю, что моя проблема может иметь какое-то отношение к моим операторам include, но япотеряно на том, как это исправить.
Distribution.hpp
Этот файл является определением класса и объявлениями четырех функций, которые я написал
#include <iostream>
class DistributionPair
{
public:
DistributionPair(std::uint32_t minValue, std::uint32_t maxValue) :
minValue(minValue),
maxValue(maxValue),
count(0)
{
}
std::uint32_t minValue;
std::uint32_t maxValue;
std::uint32_t count;
};
std::vector<DistributionPair> generateUniformDistribution(std::uint32_t, std::uint32_t, std::uint32_t, std::uint8_t);
std::vector<DistributionPair> generateNormalDistribution(std::uint32_t, float, float, std::uint8_t);
std::vector<DistributionPair> generatePoissonDistribution(std::uint32_t, std::uint8_t, std::uint8_t);
void plotDistribution(std::string, const std::vector<DistributionPair>&, const std::uint8_t);
Distribution.cpp
Этот файл содержит остальные определения этих четырех функций
#include <iostream>
#include <iomanip>
#include <random>
#include "distributions.hpp"
std::vector<DistributionPair> generateUniformDistribution(std::uint32_t howMany, std::uint32_t min, std::uint32_t max, std::uint8_t numBins)
{......
main.cpp
Это основная функция, которая отображает распределения
#include <iostream>
#include "distributions.cpp"
int main()
{......
Сообщения об ошибках
Ниже приводится сообщение об ошибке, которое я получаю при компиляции своего кода:
duplicate symbol 'generateUniformDistribution(unsigned int, unsigned int, unsigned int, unsigned char)' in:
/Users/ryanegbert/Desktop/c++/assign2/build/RandDistributions.build/Debug/RandDistributions.build/Objects-normal/x86_64/distributions.o
/Users/ryanegbert/Desktop/c++/assign2/build/RandDistributions.build/Debug/RandDistributions.build/Objects-normal/x86_64/main.o
..........
ld: 4 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Если я использую #include "distributions.hpp"
, тогда я получаю другую компиляциюошибка:
/Users/ryanegbert/Desktop/c++/assign2/main.cpp:6:20: error: implicit instantiation of undefined template 'std::__1::vector<DistributionPair, std::__1::allocator<DistributionPair> >'
auto uniform = generateUniformDistribution(100000, 0, 79, 40);
, так как мои функции определяются в Distribution.cpp.
Я использую Xcode v11.0 на Mac.
Кто-нибудь помогаетпочему я получаю ошибки компиляции?