链接器类的模板特化中的错误

时间:2018-03-11 22:24:21

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

  • 我有一个头文件TimeSeries.h,它有default_value模板的定义和特化
  • TimeSeries类有其他方法
  • 我在main.cpp中包含了TimeSeries.h文件

这是我的头文件TimeSeries.h,后跟main.cpp

    template<typename>
            struct default_value;    
            template<>
            struct default_value<int> {
               static constexpr int value = 0;
            };

            template<>
            struct default_value<double> {
               static constexpr double value = std::numeric_limits<double>::quiet_NaN();
            };

            template <typename T>
            class TimeSeries
            {
            public:
               std::vector<uint64_t> timeUsSinceMid;
               std::vector<T> values;

               void addValue(uint64_t time, T value)
                {
                 timeUsSinceMid.push_back(time);
                 values.push_back(value);
                }

               TimeSeries<T> * sample(uint64_t sampleFreq, uint64_t startTime=0, uint64_t 
                 endTime=86400*1000*1000ULL)
                {
                 //Some code
                 // I essentially faked a time and a default value push
                  TimeSeries<T>* newSample = new TimeSeries<T>;
                  newSample->timeUsSinceMid.push_back(timeUsSinceMid[0]);
                  newSample->values.push_back(default_value<T>::value);
                  return newSample;
                }
            };

这是main.cpp:

#include<TimeSeries.h>
int main(int argc, const char * argv[]) {
    TimeSeries<double> T;
    T.addValue(1, 100.0);
    T.addValue(2,200.0);
    T.addValue(3,300.0);
    T.addValue(4,400.0);
    TimeSeries<double>* newT = T.sample(2,1,6);
    //cout<<*newT<<endl;



    return 0;
}

这是链接器错误

Undefined symbols for architecture x86_64:
  "default_value<double>::value", referenced from:
      TimeSeries<double>::sample(unsigned long long, unsigned long long, unsigned long long) in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

任何人都可以解释为什么“default_value :: value”未定义?

1 个答案:

答案 0 :(得分:2)

查看this question的答案。

使用已发布代码的结构

您的模板定义定义对象value,但仍需要declared。 不要问我为什么,我只是从另一篇文章中复制@Pete Becker的答案(遗憾的是,这篇文章并不详细)。我所知道的是以下代码现在编译:

template<>
struct default_value<double> {
    static constexpr double value = std::numeric_limits<double>::quiet_NaN();
};
// EDIT: inserted line below
constexpr double default_value<double>::value;

稍微改变结构

或者,如果您不想通过大型项目跟踪价值声明,您也可以将value转换为内联方法,如下所示:(编辑< / strong>已在constexpr中添加;还注意到inline不是必需的,并且可能不会改变编译器行为)

template<>
struct default_value<int> {
    // EDIT: changed value to function
    static inline constexpr int value() {
        return 0;
    }
};

template<>
struct default_value<double> {
    // EDIT: changed value to function
    static inline constexpr double value() {
        return std::numeric_limits<double>::quiet_NaN();
    }
};

当然,请记住将TimeSeries::sample方法更改为使用default_value<>::value作为方法。