相关疑难解决方法(0)

我必须在何处以及为何要使用"模板"和"typename"关键字?

在模板,在那里,为什么我必须把typenametemplate上依赖的名字呢?究竟什么是依赖名称?我有以下代码:

template <typename T, typename Tail> // Tail will be a UnionNode too.
struct UnionNode : public Tail {
    // ...
    template<typename U> struct inUnion {
        // Q: where to add typename/template here?
        typedef Tail::inUnion<U> dummy; 
    };
    template< > struct inUnion<T> {
    };
};
template <typename T> // For the last node Tn.
struct UnionNode<T, void> {
    // ...
    template<typename U> struct inUnion {
        char fail[ -2 + (sizeof(U)%2) ]; // Cannot be instantiated for any …
Run Code Online (Sandbox Code Playgroud)

c++ templates c++-faq dependent-name typename

1061
推荐指数
8
解决办法
15万
查看次数

如果存在具有相同名称的不相关全局模板函数,为什么不需要模板关键字?

此问题与我之前的问题有关,当尝试从私有实例调用模板方法时出现编译器错误,这被指出与此问题有关:我在哪里以及为什么要放置"template"和"typename"关键字?

所以我读了这篇文章,我认为C++语言定义含糊不清,因此无法始终正确解析.在我的情况,得到的答复是,我需要a.template f<1>()B::test()帮助解析器明白,这是处理的模板.精细.

但是,在阅读了所有这些之后,template如果碰巧有一个完全不相关的全局模板函数碰巧具有相同的名称,为什么解析器突然能够在没有关键字的情况下执行?这编译没有问题,并按预期运行:

#include <iostream>

template <int i>
void f() {std::cout << "f()\n";}

template <int N>
struct A {
    template <int i>
    void f() {std::cout << "A::f()\n";}
};

template <int N>
struct B {
    A<N> a;

    B(A<N>& a) : a(a) {}

    void test() {
        f<1>();
        a.f<1>();  // compiles without 'template' keyword!
    }
};

int main() {
    A<2> a;
    a.f<1>();   // works fine
    B<2> b(a);
    b.test();
}
Run Code Online (Sandbox Code Playgroud)

我发现全局函数必须:

  • 叫做 f
  • 是一个模板功能 …

c++ templates compiler-errors

7
推荐指数
1
解决办法
302
查看次数