我对某些模板方法有疑问。
我想创建返回存储在实现类(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
此错误的原因是什么?