模板模板参数显式指定参数无效:调用函数遇编译错误求助
核心错误:模板参数传递不匹配
createPolyLine的模板参数定义为:
template<typename T = Point, template<typename S, typename Alloc> class Container, typename TAlloc = std::allocator<T>> PolyLine<T, Container> createPolyLine();
其中第二个参数是模板模板参数——要求传入容器模板本身(比如std::list),但你调用时传的是std::list<Point>,这是已经实例化的具体容器类型,并非模板本身。编译器无法将实例化后的容器类型匹配到模板模板参数,因此抛出“模板参数'Container'的显式指定参数无效”的错误。
正确调用方式应为:
// 显式指定Container为std::list,T使用默认的Point factory.createPolyLine<std::list>(); // 或显式指定T和Container factory.createPolyLine<Point, std::list>();
另外你调用时多写了一对(),createPolyLine本身返回PolyLine对象,无需额外调用。
其他潜在问题(会引发后续编译/运行错误)
PolyLine继承权限错误:PolyLine默认以私有方式继承ShapeComposite,导致外部(包括
createPolyLine函数)无法调用addShape方法,需改为public继承:class PolyLine : public ShapeComposite<T, Container, TAlloc>PolyLine构造函数硬编码基类参数:PolyLine构造函数初始化基类时用了
ShapeComposite<Point, Container, TAlloc>(),但PolyLine本身的模板参数是T,这里应改为ShapeComposite<T, Container, TAlloc>(),否则PolyLine的模板参数T失去意义,违背通用设计初衷。addShape参数不匹配:ShapeComposite的
addShape接收const std::shared_ptr<Shape>&,但createPolyLine里直接传入Line line(对象),需包装为智能指针:polyLine.addShape(std::make_shared<Line>(line));createPolyLine无返回值:函数声明返回PolyLine对象,但实现中没有
return polyLine;语句,会导致未定义行为,必须添加返回逻辑。模板类实现放置错误:C++模板需在编译时实例化,ShapeComposite和PolyLine的成员函数放在cpp文件中,编译器无法生成实例化代码,会引发链接错误。解决方法是将模板类的实现移至头文件,或在cpp文件中显式实例化所需类型。
内容的提问来源于stack exchange,提问作者Michael

