我已经指定了这样的头文件:
04-Templates_foo.h:
template <typename T>
class foo {
T x, y;
T getX(void);
void setX(T x);
};
这样的实现:
04-Templates_foo.cc:
#include "04-Templates_foo.h"
template <typename T>
T foo::getX(void) {
return this->x;
}
void foo::setX(T x) {
this->x = x;
}
我的主要例程:
04-Templates.cc
#include <iostream>
#include "04-Templates_foo.cc"
int main (void) {
// Do nothing because it doesn't even compile...
}
编译此代码会返回以下错误:
In file included from 04-Templates.cc:2:
./04-Templates_foo.cc:4:3: error: expected a class or namespace
T foo::getX(void) {
^
1 error generated.
我无法想象问题是什么。为什么我不能指定函数foo :: getX?它是一个类名,虽然编译器说它期待一个类而没有找到一个: - /
如果它可能很重要。我正在使用Mavericks在MacBook Pro Retina Mid 2012上进行编译。 我使用了这个编译命令:
g++ -o 04-Templates 04-Templates.cc
欢迎提出更好标题的建议;)
答案 0 :(得分:5)
在foo::getX
(以及setX
)的定义中,foo
的种类是什么?
因为它是一个模板类,你必须指定它,比如
template<typename T>
T foo<T>::getX(void) { ... }
您还必须告诉编译器成员函数是模板化类中每个函数的模板。所以你必须为setX
做这件事:
template<typename T>
void foo<T>::setX(T x) { ... }