我正在使用尾随返回类型。如果我将以下代码放入头文件并将其添加到库项目,然后单元测试,一切正常。 。
namespace ContainerStats {
// The trailing return type allows one to be less verbose relative to
// std::tuple<typename std::iterator_traits<Iter>::value_type,
// typename std::iterator_traits<Iter>::value_type>
template<typename Iter>
auto summean(Iter first1, Iter last1)->decltype( std::make_tuple(*first1, *first1) )
{
using value_type = typename std::iterator_traits<Iter>::value_type;
value_type sum = std::accumulate(first1, last1, value_type());
value_type mean = sum / (last1-first1);
return std::make_tuple(sum, mean);
}
}
但是,如果我将定义和实现分成标题。 。
// .h
namespace ContainerStats {
template<typename Iter>
auto summean(Iter first1, Iter last1)->decltype( std::make_tuple(*first1, *first1) );
}
和cpp。 。
template<typename Iter>
auto ContainerStats::summean(Iter first1, Iter last1)->decltype( std::make_tuple(*first1, *first1) )
{
using value_type = typename std::iterator_traits<Iter>::value_type;
value_type sum = std::accumulate(first1, last1, value_type());
value_type mean = sum / (last1-first1);
return std::make_tuple(sum, mean);
}
然后,我最终得到了一个奇怪的链接器错误。 。
Linking CXX static library libDemo.a
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: libDemo.a(ContainerStats.cpp.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: libDemo.a(ContainerStats.cpp.o) has no symbols
Linking CXX executable demo_tests
Undefined symbols for architecture x86_64:
"decltype(std::make_tuple(*(fp)*(fp))) ContainerStats::summean<std::__1::__wrap_iter<float*> >(std::__1::__wrap_iter<float*>, std::__1::__wrap_iter<float*>)", referenced from:
summean_sum_Test::TestBody() in stats_test.cpp.o
summean_mean_Test::TestBody() in stats_test.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
作为我的构建设置的健全性检查,我在头部添加了一个虚函数,返回一个只返回true
的bool和cpp实现。错误的has no symbols
部分消失,但symbols not found
部分仍然与具有尾随返回类型的函数相关。
修改
作为另一项检查,我只使用了更详细的返回类型(在第一个代码段中的代码注释中描述),并得到了相同的错误。
我做错了什么?