2012-07-06 112 views
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>(); 
} 

可惜,这是行不通的。我得到'不完整类型的错误使用'错误。没有专业化的同样的功能编译。我究竟做错了什么?

+0

是否有理由需要使用字符串文字而不是枚举? – ildjarn 2012-07-06 22:13:24

回答

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>足够你的成本?你真的想把你的城市保存为字符串文字吗?

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

+0

谢谢Zeta!多次阅读您的答案后,它开始有意义。我现在已经定义了部分模板类专业化Route ,并给它(并且只有它)一个成员函数alterFinish()。现在它可以工作,但我确实有一些阅读到这里... – user1290034 2012-07-07 06:40:21

+0

我没有在5分钟内完成....所以这里是完整的评论: 谢谢Zeta!多次阅读您的答案后,它开始有意义。我现在已经定义了部分模板类专业化Route ,并给它(并且只有它)一个成员函数alterFinish()。现在,它的工作原理,但我确实有一些阅读到这里... 我认为有必要使用模板,因为我想要编译时间检查我的路线。就像物理公式的尺寸正确性[链接](http://www.boost.org/doc/libs/1_50_0/libs/mpl/doc/tutorial/dimensional-analysis.html)。 – user1290034 2012-07-07 06:47:51