0

我最近在父类中遇到了一些 C++ 代码typedefstruct但是,它似乎在子类中不可用,即使它没有被标记private(它是protected)。我在下面创建了一个最小的工作示例(如下)来演示此失败。我已经公开了所有内容,但仍然失败。给出的错误是(使用g++):

B.h:8: error: expected ',' or '...' before '&' token
B.h.8: error: ISO C++ forbids declartion of 'Datum' with no type

啊(编译)

template<typename S, typename T> class A {
public:
    typedef struct {
        S x;
        T y;
    } Datum;
};

Bh(不编译)

#include "A.h"
template<typename Q> class B : public A<Q, Q> {
public:
    void output(const Datum& dat);
};

Bh(编译)

#include "A.h"
template<typename Q> class B : public A<Q, Q> {
public:
    typedef struct {
        Q x;
        Q y;
    } Datum;
    void output(const Datum& dat);
};

为什么第一个版本B.h无法编译?第二个是安全的选择吗?有没有更好(更简洁或惯用)的方法来处理这个问题?

4

2 回答 2

2

你需要说typename A<Q,Q>::Datum里面B。由于基础是一个模板,它的名称是依赖名称,在第一阶段不可见,您需要typename指定名称命名一个类型(而不是值或模板)。

你也应该失去typedef. C++ 与 C 的工作方式不同,你应该说:

struct Datum { S x; T y };
于 2012-08-15T17:22:32.573 回答
1

typedef struct {
    S x;
    T y;
}

格式不正确。typedef需要一个类型和一个“别名”来命名该类型。你可能需要的是

template<typename S, typename T> 
class A {
 public:
    struct Datum { S x; T y; };
};

没有 typedef,这里根本不需要。然后,您需要Datum正确限定名称,如typename A<Q,Q>::Datum

#include "A.h"
template<typename Q> 
class B : public A<Q, Q> {
 public:
    void output(const typename A<Q,Q>::Datum& dat);
};
于 2012-08-15T17:22:48.877 回答