我有以下情况:
template <class A, typename B, typename C, class D>
class Base
{
public:
// ctor and virtual dtor
// functions
class Inner
{
//...
};
protected:
// members
};
template <class E>
class Sub : public Base<std::string, float, double, E>
{
public:
// ctor and virtual dtor
// functions using Inner class inherit from Base
};
虽然msvc编译得很好(使用ctp nov 2012编译器的visual studio 2012),gcc(来自trunk的4.9.0版本)会抱怨从Base使用的每个成员以及Base中的内部类。
我注意到msvc在模板方面相当宽松,但是我还需要运行这个代码并在linux下用gcc编译。那么,msvc接受的伪代码在哪里但gcc不是?
答案 0 :(得分:2)
核心问题是,不依赖于模板参数的名称会在声明中查找,而不是实例化时间。使用例如Base<std::string, float, double, E>::Inner
而非Inner
,或在您的班级中添加使用声明:using Base<std::string, float, double, E>::Inner
。这将使名称依赖,从而查看实例化时间。
有关详细信息,请搜索“依赖名称查找”。