我正在尝试编写一个模板类,它有助于程序员编写正确的代码。鉴于从旧金山到华盛顿的路线以及从华盛顿到纽约的路线,它将计算从旧金山到纽约的路线。当从旧金山到洛杉矶和华盛顿到纽约的路线时,编译器将报告错误。
这是班级(没有正常的主力函数):
extern const char miami[] = "Miami";
template< const char* FINISH, const char* START>
class Route {
public:
Route();
~Route() {};
template<const char* OTHERPLACE>
Route<START, OTHERPLACE> alterFinish() const;
};
template<const char* START> // specialisation
template<const char* OTHERPLACE>
// Allow only miami as FINISH to be changed to something else.
Route<START, OTHERPLACE> Route<START, miami>::alterFinish() const{
return Route<START, OTHERPLACE>();
}
不幸的是,这不起作用。我得到'无效使用不完整类型'错误。没有专业化的相同类型的函数会编译。我做错了什么?
答案 0 :(得分:2)
invalid use of incomplete type
表示您使用了尚未声明的内容。在这种情况下,它是Route
:
template <const char* START>
class Route<START,miami>{
template<const char* OTHERPLACE>
Route<START, OTHERPLACE> alterFinish() const;
};
你为什么需要这个?好吧,你想创建一个方法alterFinish()
,它应该专门用于template<class START> Route<START, miami>
。全名是Route<START, miami>::alterFinish()
。但是你从来没有在任何地方定义template<class START> Route<START, miami>
。它是一个不完整的类型,因此编译器无法编译。
但是,我相信您的计划还有其他一些问题。你真的有必要使用模板吗?不会像std::map<std::pair<city,city>, double>
那样足以支付您的费用吗?你真的想把你的城市保存为字符串文字吗?
此外,还不清楚为什么您的程序在您的特殊情况下崩溃。根本没有足够的代码,即使您提供的代码也不会提供编译器错误,除非添加必要的调整并移动许多符号。