以下代码在GCC 9.1和Clang 9.0上都无法编译:
#include <iostream>
#include <string>
template<typename ...> class Foo;
template<typename T>
class Foo<T>{
public:
void foo() {
std::cout << "foo (1)\n";
}
};
template<typename T, typename ... Tail>
class Foo<T, Tail...> : public Foo<Tail...> {
public:
void foo() {
std::cout << "foo (2)\n" ;
}
};
class Bar : public Foo<std::string, int> {
public:
template<typename ...Args>
void test(Foo<Args...> f) {
f.foo();
}
};
class Baz : public Foo<int, std::string> {
public:
template<typename ...Args>
void test(Foo<Args...> f) {
f.foo();
}
};
int main() {
Bar a;
Bar b;
a.test(b);
Bar c;
Baz d;
c.test(d);
return 0;
}
不过,它与最新版本一起工作得很好。
- 挪威**
- 挪威**
- Godbolt GCC 12.1-〉确定
- Godbolt Clang 12.0-〉确定
这段代码实际上有效吗?为什么它被认为是不明确的?有没有任何变通办法可以在以前版本的GCC和Clang中使用?
3条答案
按热度按时间q9yhzks01#
另一个解决方案是稍微放松一下test()模板函数的要求。
例如:
输出:
wgx48brx2#
这是GCC和Clang的一个可能的解决方法:为方便起见,我在派生的base* 类中插入了一个类型别名,这样您就可以在两种情况下使用相同的语法调用
test
。用gcc 9.1和clang 9在goldbolt上检查它。
ftf50wuq3#
代码是有效的,而且显然不会模糊到在使用最新的gcc编译器编译时失败。在使用较旧的编译器时,可以使用static_cast〈〉来更显式。
例如:
你可以在这里找到代码:https://godbolt.org/z/YjPqaKdbj