C++ 使用c+;中其他文件中声明的模板+;

C++ 使用c+;中其他文件中声明的模板+;,c++,templates,C++,Templates,可能重复: 我在一个文件中定义了一个模板类 h点是 #ifndef POINT_H #define POINT_H using namespace std; template <typename T, int size> class point { private: T coordinates[size]; public: point(); void set_coordinates(const T *); void get_coordinat

可能重复:

我在一个文件中定义了一个模板类

h点是

#ifndef POINT_H
#define POINT_H

using namespace std;

template <typename T, int size>
class point {
private:
    T coordinates[size];

public:
    point();
    void set_coordinates(const T *);
    void get_coordinates(T *);
};

#endif  /* POINT_H */

但是没有别的办法吗?(我的意思是在C++标准容器中,他们可能使用了一些技术来完成这一任务)。

< p>阅读下面的两个常见问题——

阅读下面的两个常见问题:

< p> C++标准容器的解决方案是将所有的东西放在头文件中。

< p> C++标准容器的解决方案是将所有的东西放在头文件中。

你应该把所有定义都属于模板。
point
(即,包括成员函数)添加到
point.h
文件中,并将其包含在使用
point
类的任何文件中,以便编译器可以根据需要实例化它。有关详细信息,请参阅


< > C++编译器和链接器有办法避免链接上的“多定义”错误(标准中的ODR规则必须是这样的)。

< P>您应该把所有定义都属于模板<代码>点<代码>(即,包括成员函数)指向
point.h
文件,并将其包含在使用
point
类的任何文件中,以便编译器可以根据需要实例化它。有关详细信息,请参阅

< > C++编译器和链接器有办法避免链接上的“多定义”错误(标准中的ODR规则必须是这种情况)。
#include "point.h"

template <typename T, int size>
point::point() {
    for (int i = 0; i < size; i++)
        coordinates[i] = 0;
}

template <typename T, int size>
void point<T, size>::set_coordinates(const T *coordinates) {
    for (int i = 0; i < size; i++)
        this->coordinates[i] = coordinates[i];
}

template <typename T, int size>
void point<T, size>::get_coordinates(T *coordinates) {
    for (int i = 0; i < size; i++)
        coordinates[i] = this->coordinates[i];
}
template <> class point<int> {
    ...
}