链接器错误与模板化返回类型

时间:2015-05-21 09:43:08

标签: c++ c++11 linker linker-errors

我正在使用尾随返回类型。如果我将以下代码放入头文件并将其添加到库项目,然后单元测试,一切正常。 。

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部分仍然与具有尾随返回类型的函数相关。

修改

作为另一项检查,我只使用了更详细的返回类型(在第一个代码段中的代码注释中描述),并得到了相同的错误。

我做错了什么?

0 个答案:

没有答案