我有三个文件:
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 ';'
答案 0 :(得分:2)
X::Y::Z::Position
模板阴影的定义 ::Position
typedef。它在X::Y::Z
内不可见。
您不能使用相同的名称来引用同一范围内的模板和类型。你需要改变其中一个。