0

我正在尝试编写一个模板类来帮助程序员编写正确的代码。给定从旧金山到华盛顿的路线和从华盛顿到纽约的路线,它将计算从旧金山经华盛顿到纽约的路线。当给出从旧金山到洛杉矶和华盛顿到纽约的路线时,编译器会报错。

这是类(没有正常的主力功能):

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

不幸的是,这不起作用。我收到“无效使用不完整类型”错误。没有专门化的相同类型的函数确实可以编译。我究竟做错了什么?

4

1 回答 1

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>对于您的成本来说,这还不够吗?您真的想将您的城市保存为字符串文字吗?

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

于 2012-07-06T23:46:12.863 回答