头文件中模板 class 实现的模板成员
Template member of template class implementation in header file
我有一个 class 看起来像这样
template<class T>
class Matrix {
...
template<class T2> auto dot(Matrix<T2> const& other);
}
这是我的实现,在头文件中的声明下:
template<class T, class T2>
auto Matrix<T>::dot(Matrix<T2> const& other) {
[impl]
}
我收到的错误如下所示:
(C2244) 'Matrix<T>::dot' : unable to match function definition to an existing declaration
我哪里错了?
语法错误。您在带有模板参数 T
的 class 模板中有一个带有模板参数 T2
的函数模板。它必须这样定义:
template<class T>
template<class T2>
auto Matrix<T>::dot(Matrix<T2> const& other) {
}
这不是答案,而是这个(类似)问题的重复——class 首先是 defined/declared,编译器可以接受它:
template<typename UnsignedInt,
std::enable_if_t<std::is_unsigned<UnsignedInt>::value, int> = 0>
class binangle {
...
template<typename F>
void set_from_degrees(F rad);
...
然而,当它实施时
template<typename F>
void binangle<UnsignedInt>::set_from_radians(F rad) {
static_assert(std::is_unsigned<UnsignedInt>::value);
static_assert(std::is_floating_point<F>::value);
...
它抛出错误:
/home/sipan/src/vgit/signals/tests/../include/binangles_impl.hpp:23:51: error: invalid use of incomplete type ‘class signals::binangle<UnsignedInt>’
23 | void binangle<UnsignedInt>::set_from_radians(F rad) {
| ^
这是你能得到的最接近教科书的例子
//template member definition
template<typename T>
template<typename T2>
void A<T>::f(T2)
{
// some code
}
但是失败了。
我有一个 class 看起来像这样
template<class T>
class Matrix {
...
template<class T2> auto dot(Matrix<T2> const& other);
}
这是我的实现,在头文件中的声明下:
template<class T, class T2>
auto Matrix<T>::dot(Matrix<T2> const& other) {
[impl]
}
我收到的错误如下所示:
(C2244) 'Matrix<T>::dot' : unable to match function definition to an existing declaration
我哪里错了?
语法错误。您在带有模板参数 T
的 class 模板中有一个带有模板参数 T2
的函数模板。它必须这样定义:
template<class T>
template<class T2>
auto Matrix<T>::dot(Matrix<T2> const& other) {
}
这不是答案,而是这个(类似)问题的重复——class 首先是 defined/declared,编译器可以接受它:
template<typename UnsignedInt,
std::enable_if_t<std::is_unsigned<UnsignedInt>::value, int> = 0>
class binangle {
...
template<typename F>
void set_from_degrees(F rad);
...
然而,当它实施时
template<typename F>
void binangle<UnsignedInt>::set_from_radians(F rad) {
static_assert(std::is_unsigned<UnsignedInt>::value);
static_assert(std::is_floating_point<F>::value);
...
它抛出错误:
/home/sipan/src/vgit/signals/tests/../include/binangles_impl.hpp:23:51: error: invalid use of incomplete type ‘class signals::binangle<UnsignedInt>’
23 | void binangle<UnsignedInt>::set_from_radians(F rad) {
| ^
这是你能得到的最接近教科书的例子
//template member definition
template<typename T>
template<typename T2>
void A<T>::f(T2)
{
// some code
}
但是失败了。