22,297
社区成员




最近写了个代码,需求是定义一个类A,有一个模板函数,又定义了一个模板类B,B中也定义了一个模板函数。
将A作为B的模板参数进行实例化,在B的模板函数中调用A的模板函数,ubuntu18.04中的GCC 7.5.0报错(在VS2015、VS2019编译都没问题,ubuntu16.04中的GCC 5.4.0也没问题),求大神帮忙解决下?
代码如下
#include <iostream>
#include <string>
#include <utility> // for std::pair
// 类A的定义
class A {
public:
// 模板成员函数
template<typename T>
void Set(T value) {
std::cout << "A::Set called with value: " << value << std::endl;
}
// 模板成员函数,返回一个默认构造的T
template<typename T>
T Get() {
std::cout << "A::Get called, returning default-constructed T" << std::endl;
return T();
}
};
// 模板类B的定义
template<typename TA>
class B {
private:
TA a_instance; // A的实例作为B的成员
public:
// 模板成员函数
template<typename T>
void Set(T value) {
std::cout << "B::Set called with value: " << value << std::endl;
a_instance.Set<T>(value);
//a_instance.Set(value);//去掉显示模板调用可以编译
}
// 模板成员函数,返回一个默认构造的T
template<typename T>
T Get() {
std::cout << "B::Get called, calling A::funcA and returning its result" << std::endl;
// 调用A的模板成员函数并返回其结果
return a_instance.Get<T>();
//return a_instance.Get();//去掉显示模板调用,会报错类型退到错误
}
};
int main() {
// 创建B<A>的对象,即B的模板参数为A
B<A> b;
int int_value = b.Get<int>();
std::string strSet = "set string";
b.Set<std::string>(strSet);
return 0;
}
报错如下:
像是模板在没有实例化时,不没有检查到调用的A函数也是模板函数,到A的函数模板参数<T>报错了。