gpt4 book ai didi

c++ - 模板类中特殊函数的声明

转载 作者:太空宇宙 更新时间:2023-11-04 14:00:30 24 4
gpt4 key购买 nike

我遇到的问题是模板类中专用模板函数的声明(我在头文件中保留类声明并在关联的 .C 文件中定义成员函数)。

我有代表点的模板类。头文件如下:

//...

template<typename T, int dim=3> // T - coords. type, int dim - no. of dimensions
class Point {
public:
// ...
// function below sets val at the given position in array m_c and returns reference
template<int position> Point& set(T val);
private:
T m_c[dim]; // coordinates
};

//...

函数定义set放在.C文件中:

template<typename T, int dim> template<int position> Point<T, dim>& Point<T, dim>::set(T val){
// ...
return *this;
}

据我所知,这是其定义的最一般形式。

在 main 函数中我创建了 Pointfloat作为T并尝试在数组中设置一些值:

int main(int argc, char** argv) {
Point<float> p1;
p1.set<0>(3).set<1>(3.6).set<2>(3);
//...
}

为了通过在头文件之外定义模板的成员函数来实现这一点,我需要通知编译器关于 .C 文件的特化:

template class Point<float>;

我还需要声明 set 函数的用法,我尝试通过这种方式完成(这段代码就是问题所在):

template<> template<int> Point<float>& Point<float>::set(float);

不幸的是,这并没有完成工作,我得到了错误:

/tmp/ccR7haA5.o: In function `main':
.../pdim.C:32: undefined reference to `Point<float, 3>& Point<float, 3>::set<0>(float)'
.../pdim.C:32: undefined reference to `Point<float, 3>& Point<float, 3>::set<1>(float)'
.../pdim.C:32: undefined reference to `Point<float, 3>& Point<float, 3>::set<2>(float)'

我非常感谢可能知道如何处理这个问题的人的解释。谢谢。

最佳答案

为了在不同的TU中提供函数模板特化的定义,你需要一个显式的实例化声明:

[点.hpp]

template<typename T, int dim=3>
struct Point
{
template<int position> Point& set(T val);
};

// `extern` makes this an explicit instantiation _declaration_
extern template Point<float,3>& Point<float,3>::set<0>(float);
extern template Point<float,3>& Point<float,3>::set<1>(float);
extern template Point<float,3>& Point<float,3>::set<2>(float);

[点.cpp]

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

template<typename T, int dim>
template<int position>
Point<T,dim>& Point<T,dim>::set(T val)
{
// note: non-standard macro
std::cout << __PRETTY_FUNCTION__ << std::endl;
return *this;
}

// no `extern`: this is an explicit instantiation _definition_
// which instantiates the function template, and therefore requires the definition
// to be available in this TU
template Point<float,3>& Point<float,3>::set<0>(float);
template Point<float,3>& Point<float,3>::set<1>(float);
template Point<float,3>& Point<float,3>::set<2>(float);

[ main.cpp ]

#include "Point.hpp"

int main()
{
// in this TU, there's no definition for the function template
// hence, it cannot be instantiated
// however, we can use the explicit instantiations

Point<float,3>().set<0>(0);
Point<float,3>().set<1>(0);
Point<float,3>().set<2>(0);

// does not compile (linker error):
//Point<int,3>().set<0>(0);
//Point<float,4>().set<0>(0);
//Point<float,3>().set<4>(0);
}

关于c++ - 模板类中特殊函数的声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19526151/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com