0

可能重复:
为什么模板只能在头文件中实现?
什么是未定义的引用/未解决的外部符号错误,我该如何解决?

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

点.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 是

#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];
}

我将此模板用作point<int, 2> p0;. 但是编译器给出了point<int, 2>未定义的错误。我对此进行了搜索,发现了两个解决方案 - 1. 使用export变量。但我读到并非所有编译器都支持它。所以,我不想用那个。2.创建明确的类专业化,如

template <> class point<int> {
    ...
}

但是没有其他方法可以做到这一点吗?(我的意思是在 C++ 标准容器中,他们可能使用了一些技术来做到这一点。)

4

3 回答 3

2

阅读这个和接下来的两个常见问题解答 - C++ 常见问题解答

于 2012-09-29T10:22:11.707 回答
1

c++ 标准容器的解决方案是将所有内容都保存在头文件中。

于 2012-09-29T10:24:09.237 回答
1

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

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

于 2012-09-29T10:24:20.783 回答