头文件中的C ++模板,实现文件中的错误* .cc“错误:期望一个类或命名空间”

时间:2013-11-20 07:47:14

标签: c++ templates typename

我已经指定了这样的头文件:

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

欢迎提出更好标题的建议;)

1 个答案:

答案 0 :(得分:5)

foo::getX(以及setX)的定义中,foo种类是什么?

因为它是一个模板类,你必须指定它,比如

template<typename T>
T foo<T>::getX(void) { ... }

您还必须告诉编译器成员函数是模板化类中每个函数的模板。所以你必须为setX做这件事:

template<typename T>
void foo<T>::setX(T x) { ... }