gpt4 book ai didi

c++ - 为什么我收到错误 "non-template ' f' used as template”

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:04:17 25 4
gpt4 key购买 nike

我正在尝试了解在哪里使用 templatetypename我遇到了一个我无法完全解决的问题。我有一个模板函数 f<T>它使用传递给它的类型(将是一个类)来调用模板成员函数 .f<T> .我想我使用 typename在函数体中是正确的,但是,我不断收到以下错误:

source.cpp: In function 'void f()':
source.cpp:11:19: error: non-template 'f' used as template
source.cpp:11:19: note: use 'typename T::C::template f' to indicate that it is a template

struct A {
struct C {
template <typename T> void f() {}
};
};

template <typename T> void f() {

typename T::C::f<int>();

}

int main() {

f<A>();

}

注意它建议使用 'typename T::C::template f' 的最后一个错误。反而。所以我做了如下修改:

// ...
typename T::C::template f<int>();
// ...

我照它说的做了,但是我收到了下一行错误:

error: no class template named 'f' in 'struct A::C'

我认为这个错误是不正确的,因为实际上一个名为f的公共(public)模板函数在 struct A::C .我在这里做错了什么?

最佳答案

假设我们制作 f static所以它可以在没有实例的情况下被调用,你不需要 typename因为您没有使用依赖类型创建任何歧义(即 C 不能是变量,因为您将它与 :: 一起使用)。这是正确的语法:

struct A {
struct C {
template <typename T>
static void f() {}
};
};

template <typename T> void f() {
T::C::template f<int>();
}

如果你不想让它成为静态的,你可以创建一个 A::C并使用 .template f<int>() :

struct A {
struct C {
template <typename T>
static void f() {}
};
};

template <typename T> void f() {
typename T::C c;
//^^^^^^^^ Now we DO need typename to disambiguate.

c.template f<int>();
}

关于c++ - 为什么我收到错误 "non-template ' f' used as template”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12959250/

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