2012-09-29 41 views
0

可能重复:
Why can templates only be implemented in the header file?
What is an undefined reference/unresolved external symbol error and how do I fix it?在C在其他文件中声明使用模板++

我已经在一个文件中定义的模板类。

point.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 */ 

point.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++标准集装箱,他们可能使用了一些技术来做到这一点。)

+1

http://stackoverflow.com/a/12574417/673730 –

回答

1

的C的解决方案++标准容器是把一切都在头文件。

1

你应该把所有属于该模板point的定义(即,包括成员函数)的point.h文件,并将其包含在使用了point类,以便需要编译器能够实例化它的任何文件。详情请参阅this question

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