相关疑难解决方法(0)

实例化模板时,其不完整参数类型的成员是否应该可见?

在下面的示例中,A有一个成员typedef Instantiate导致实例化B<A>.

template<typename T>
struct B
{
    typedef typename T::Before Before; // ok
    typedef typename T::After After; // error: no type named 'After' in 'A<int>'
};

template<typename T>
struct A
{
    typedef int Before;
    typedef typename B<A>::After Instantiate;
    typedef int After;
};

template struct A<int>; // instantiate A<int>
Run Code Online (Sandbox Code Playgroud)

我尝试过的所有编译器都报告说,虽然A::Before可见但A::After并非如此.这种行为是否符合标准?如果是这样,标准在哪里指定A在实例化期间哪些名称应该可见B<A>

如果依赖名称"在模板实例化时查找",那么在由模板参数限定的名称场景中,这意味着什么T::After

编辑:请注意,当A不是模板时,会发生相同的行为:

template<typename T>
struct B
{
    typedef typename T::Before Before; // ok
    typedef typename T::After …
Run Code Online (Sandbox Code Playgroud)

c++ templates language-lawyer

6
推荐指数
1
解决办法
705
查看次数

标签 统计

c++ ×1

language-lawyer ×1

templates ×1