类模板,具有模板功能,专业化

时间:2012-07-06 22:00:22

标签: c++

我正在尝试编写一个模板类,它有助于程序员编写正确的代码。鉴于从旧金山到华盛顿的路线以及从华盛顿到纽约的路线,它将计算从旧金山到纽约的路线。当从旧金山到洛杉矶和华盛顿到纽约的路线时,编译器将报告错误。

这是班级(没有正常的主力函数):

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>();
}

不幸的是,这不起作用。我得到'无效使用不完整类型'错误。没有专业化的相同类型的函数会编译。我做错了什么?

1 个答案:

答案 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>那样足以支付您的费用吗?你真的想把你的城市保存为字符串文字吗?

此外,还不清楚为什么您的程序在您的特殊情况下崩溃。根本没有足够的代码,即使您提供的代码也不会提供编译器错误,除非添加必要的调整并移动许多符号。