带有名称空间的模板化结构的Typedef

时间:2014-03-09 10:14:35

标签: c++

我有三个文件:

position.h:

namespace X {
namespace Y {
namespace Z {

template<typename T1 = long, typename T2 = long>
struct Position {
};

}}}

class_from_api.h

#include "position.h"

typedef X::Y::Z::Position<> Position;

namespace X {
namespace Y {
namespace Z {

class ClassFromAPI {
    Position<> p;  // why not Position?
};

}}}

typedef X::Y::Z::ClassFromAPI ClassFromAPI;

user_class.h:

#include "class_from_api.h"

Class UserClass : public ClassFromAPI {
    Position p;
};

我的问题是:为什么我要写ClassFromAPI“Position&lt;&gt;”而在UserClass中,有必要写“位置”,尽管两者都有相同的typedef。

ClassFromAPI中的更改导致:

error C2955: 'X::Y::Z::Position' : use of class template requires template argument list

更改UserClass结果:

error C2059: syntax error : '<'
error C2238: unexpected token(s) preceding ';'

1 个答案:

答案 0 :(得分:2)

X::Y::Z::Position模板阴影的定义 ::Position typedef。它在X::Y::Z内不可见。

您不能使用相同的名称来引用同一范围内的模板和类型。你需要改变其中一个。