【发布时间】:2019-12-08 04:22:50
【问题描述】:
我正在尝试编写一个 C++ 函数模板,当使用类成员别名的参数调用该函数时,该函数可以推断出该别名的类。一个简化版本的会很好:
class A {
public :
using x_t = float;
void whatami() {printf("A\n");}
};
class B {
public :
using x_t = int;
void whatami() {printf("B\n");}
};
template<typename T>
void fn(T::x_t x) {
T t;
t.whatami();
};
...
A::x_t a;
fn(a);
...
g++ 7.3 的错误是:
play$ g++ --std=c++11 x.cpp
x.cpp:19:12: error: variable or field ‘fn’ declared void
void fn(T::x_t x) {
^~~
x.cpp:19:16: error: expected ‘)’ before ‘x’
void fn(T::x_t x) {
^
x.cpp: In function ‘int main(int, char**)’:
x.cpp:29:3: error: ‘fn’ was not declared in this scope
fn(a);
^~
我将其解释为 C++ 不能像 fn(T::x_t x) 那样推断 T,但我不确定。
想法?
【问题讨论】:
-
这样的扣除是不可能的。如果允许,那将是非常低效的。编译器需要检查
x_t成员的所有可能类型,并将其与函数参数的类型进行比较,如果两个类匹配会发生什么?您可能想要添加为什么您需要此功能。可能有一种更简单的方法。 -
谢谢。我从您的评论(和 parktomatomi)中得知,当编译器看到
fn(a)时,它实际上并不知道 a 是 A::x_t。在那种情况下,我明白为什么这会成为一个问题。至于为什么?这是对某事的早期尝试,当我做不到时变成了智力挑战。最后,我正在做一些完全不同的事情。感谢所有回复的人。 -
是的,在名称查找之后,
A::x_t和float完全相同。using没有声明新类型。它只是为该类型提供一个别名。如果你写float a;而不是A::x_t a;它是完全相同的,并且该语言不提供任何方法来确定a是否已使用float或A::x_t作为类型声明。
标签: c++ template-argument-deduction function-templates