为什么模板的默认值不起作用

时间:2018-12-27 13:37:50

标签: c++ templates

我对某些模板方法有疑问。

我想创建返回存储在实现类(Impl)中的数据的模板方法,但是我不想使该方法返回显式的某种类型(此处为int)。仅当模板参数为int时,此方法才返回真实数据,在其他情况下,我想返回所选类型的默认值。

但是它不适用于int 以外的其他类型。

下面是我可以创建的最小工作示例。

foo.hpp

#ifndef FOO_HPP_
#define FOO_HPP_

#include <memory>

class Foo {
 public:
  Foo() noexcept;
  ~Foo() noexcept;
  /**
   * @brief     Gets data stored in @c Foo object
   * @tparam T  Type of data stored in @c Foo object
   * @return    Data stored in Foo object
   */
  template <typename T>
  T &GetData();
 private:
  /// Implementation class
  class Impl;
  /// Pointer to implementation (PIMPL)
  std::unique_ptr<Impl> impl_;
};
#endif  // FOO_HPP_

foo.cpp

#include "foo.hpp"

class Foo::Impl {
 public:
  template <typename T>
  T &GetData();
 private:
  int data_ = 10;
};

template <typename T>
T &Foo::Impl::GetData()
{
  return T();  // < here is the problem (?)
}

template <>
int &Foo::Impl::GetData<int>()
{
  return data_;
}

template <typename T>
T &Foo::GetData()
{
  return impl_->GetData<T>();
}

template <>
int &Foo::GetData()
{
  return impl_->GetData<int>();
}

Foo::Foo() noexcept : impl_(std::make_unique<Impl>()) {}
Foo::~Foo() noexcept {}

main.cpp

#include <iostream>
#include "foo.hpp"

int main() {
  Foo foo;
  std::cout << foo.GetData<int>() << "\n"; // It outputs '10', so it works
  // std::cout << foo.GetData<char>() << "\n"; // < It doesn't compile

  return 0;
}

使用命令g++ main.cpp foo.cpp -o foo -Wall -std=c++17编译后的错误是:

/tmp/ccu1RPQW.o: In function `main':
main.cpp:(.text+0x38): undefined reference to `char& Foo::GetData<char>()'
collect2: error: ld returned 1 exit status

此错误的原因是什么?

0 个答案:

没有答案