gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:39:06 26 4
gpt4 key购买 nike

这个问题与我之前的问题Compiler error when trying to call template method from private instance有关,被指出与这个问题有关:Where and why do I have to put the "template" and "typename" keywords?

所以我读了这篇文章,我明白 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();
}

我发现全局函数必须:

  • 被称为f
  • 成为模板函数
  • B之前定义

否则,它几乎可以是任何东西。所以

template <typename T, unsigned k>
void *f(double x, const char *s) {return NULL;}

同样可以帮助解析器解决 a.f<1>()B::test()实际上被解析为 a.template f<1>() .

编译器在想什么?比如:“好吧,这家伙已经有了一个名为 f<>() 的全局模板函数,所以当我在 a.f<1>() 中解析这个完全不相关的表达式 B::test() 时,我会假设它也是一个模板函数吗?”这是什么?

阅读时我错过了什么 Where and why do I have to put the "template" and "typename" keywords?

更新

上面的代码为我编译了所有:

  • i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1(基于 Apple Inc. build 5658)(LLVM build 2336.9.00)
  • Apple clang 版本 3.1 (tags/Apple/clang-318.0.58)(基于 LLVM 3.1svn)
  • g++-4.8 (海湾合作委员会) 4.8.2

我还测试了编译器标志 -pedantic -Wall -Wextra-std=c++11对于 g++-4.8 .它适用于所有情况。

更新 2

这在没有 template 的情况下也有效关键词:

// ...
template <int N, template <int> class A>
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, A> b(a);
b.test();
}

最佳答案

我认为 g++ 是正确的并且代码应该在没有 .template 的情况下编译。按照标准(至少按照我的理解),

3.4.5/1(N3936 第 55 页)

在类成员访问表达式 (5.2.5) 中,如果 . or -> 标记紧跟一个标识符,然后是一个 <,必须查找标识符以确定 < 是模板参数列表 (14.2) 的开头还是小于运算符。首先在对象表达式的类中查找标识符。如果没有找到标识符,则在整个后缀表达式的上下文中查找它,并命名一个类模板。

关于c++ - 如果存在同名的不相关全局模板函数,为什么不需要模板关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23892498/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com