我尝试在C ++中编写一个简单的函数my_to_string()
,它带有两个迭代器first
和last
。我希望函数具有典型的行为:它将迭代[first,last)
并对对象做一些事情。只具有读访问权限的数据。我在一个文件stringformat.h
中声明了此函数的声明,它在stringformat.cpp
中的定义,我尝试从另一个.cpp
文件中调用它。
所有文件编译正常。
我使用Eclipse CDT来构建我的项目。
现在我的问题是我收到以下链接器错误(从Eclipse控制台直接复制粘贴,仅出于隐私原因重命名了主目录):
Invoking: Cross G++ Linker
g++ -o "agos2" ./agos/pairingfunctions/CantorPairingFunction.o ./agos/pairingfunctions/CantorTupleIncrementer.o ./agos/pairingfunctions/PairingFunction.o ./agos/machine/Instruction.o ./agos/machine/Machine.o ./agos/machine/MachineFactory.o ./agos/machine/Operation.o ./agos/machine/Program.o ./agos/goedelnumbering/multiplier/InstructionGoedel.o ./agos/goedelnumbering/multiplier/InstructionIncrementer.o ./agos/goedelnumbering/multiplier/MachineIncrementer.o ./agos/goedelnumbering/multiplier/OperationIncrementer.o ./agos/goedelnumbering/multiplier/ProgramIncrementer.o ./agos/BigIntegerLibrary/BigInteger.o ./agos/BigIntegerLibrary/BigIntegerAlgorithms.o ./agos/BigIntegerLibrary/BigIntegerUtils.o ./agos/BigIntegerLibrary/BigUnsigned.o ./agos/BigIntegerLibrary/BigUnsignedInABase.o ./agos/Agos.o ./agos/Int64ToInt64Function.o ./agos/stringformat.o ./agos.o
./agos/machine/Machine.o: In function `agos::Machine::toStringWithState() const':
/home/username/workspace-cpp/agos2/Debug/../agos/machine/Machine.cpp:280: undefined reference to `std::string agos::my_to_string<__gnu_cxx::__normal_iterator<long const*, std::vector<long, std::allocator<long> > > >(__gnu_cxx::__normal_iterator<long const*, std::vector<long, std::allocator<long> > >, __gnu_cxx::__normal_iterator<long const*, std::vector<long, std::allocator<long> > >)'
collect2: error: ld returned 1 exit status
make: *** [agos2] Error 1
代码在这里:
stringformat.h
//...
template<class InputIterator>
std::string my_to_string(InputIterator first, InputIterator last);
//...
stringformat.cpp
//...
template<class InputIterator>
string my_to_string(InputIterator first, InputIterator last) {
ostringstream oss;
if (last - first > 0) {
for (; first + 1 != last; ++first) {
oss << *first << ' ';
}
oss << *first;
}
return oss.str();
}
//...
代码使用函数:
#include "../stringformat.h"
//...
void my_use_case() {
vector<int64_t> const& v = ...;
string s;
s = my_to_string(v.begin(), v.end()); // Linker complains here; this is line 280
//...
}
在链接器命令中,包含了stringformat.o,所以我认为应该找到该函数。我还积极检查了我的项目文件夹中是否存在stringformat.o文件。
我还尝试在my_use_case()
之前复制粘贴功能定义。然后编译好。没有任何错误。但这不是一个好的解决方案。