【问题标题】:template function friend of template class with same Type具有相同类型的模板类的模板函数朋友
【发布时间】:2011-07-30 06:33:32
【问题描述】:

下面的代码中显然有一个外部代码,如果有人能指出如何避免它,将不胜感激。

谢谢

1>----- 构建开始:项目:Ch16,配置:调试 Win32 ------
1> p657_b_print.cpp
1>p657_b_main.obj:错误 LNK2019:无法解析的外部符号“void __cdecl compare(int &,class Car &)”(??$compare@H@@YAXAAHAAV?$Car@H@ @@Z) 在函数 _main 中引用
1>\na-13\my documents\visual studio 2010\Projects\Ch16\Debug\Ch16.exe : 致命错误 LNK1120: 1 unresolved externals
========== 构建:0 成功,1 失败,0 最新,0 跳过 ==========

p657_b.h

#ifndef P657H
#define P657H

template< class T> class Car; 
template<class T1> void  compare(T1&, Car<T1>&);

template< class T> class Car { 
    friend void  compare<T> (T&, Car<T>&);

private:
    T Wheels;

public:
    Car(): Wheels(4)  {}
    Car(T);
};

#include "p657_b.cpp"
#include "p657_b_print.cpp"

#endif

p657_b.cpp

#ifndef P643CC
#define P643CC

#include <iostream>
#include <string>
using std::string;
using std::cout;
using std::endl;
#include "p657_b.h"

template<class T> Car<T>::Car(T w) {
    Wheels = w;
}
#endif

p657_b_print.cpp

#ifndef p657_CC
#define p657_CC
#include "p657_b.h"
#include<iostream>
using namespace std;

template <class T>
void compare(T &iv1, Car<T> &c1) {
    cout << iv1 << endl;
    cout << c1.Wheels << endl;
}

#endif

p657_b_main.cpp

#include "p657_b.h"
#include<iostream>
#include<string>
using namespace std;

int main()
{
    Car<int> myCar;
    int iv = 5;
    compare(iv, myCar);

    return 0;
}

【问题讨论】:

  • 通常你不应该将 .cpp 文件包含到 .h 文件中。 .h 文件通常包含类/函数声明和内联/模板实现。 .cpp 文件包含其余部分。 .cpp 文件应包括它们所依赖的所有 .h 文件。 .cpp 文件应独立编译,而不是作为其他 .cpp 文件的一部分。
  • 这通常是正确的,但在模板的情况下,我已经读过在包含编译模型中你将声明放在 .h 文件中,然后你在 .h 中包含 .cc 和定义,因为编译器需要查看任何使用过的模板的定义
  • 一个头文件两个不同的cpp文件的目的是什么?
  • 没有我想,这是一个好点。让我看看它是否使代码工作。
  • 现在可以使用了 - 非常感谢。该代码还可以通过执行 Andrey 下面的建议来工作。目前我更喜欢我的文件组织方式,即 Lippman 建议的方式。当我阅读 Stroustrup 时,我可能会改变主意,但我的生活已经足够复杂,只关注一位作者,所以只有在我对自己所做的事情更有信心之后,我才会考虑不同的方法。谢谢

标签: c++ class templates function


【解决方案1】:

整个模板定义必须在一个文件中。您应该合并_b.cpp_b.h 并在您的程序中包含完整的模板。

【讨论】:

  • 在一个文件中。所有内容都包含在p657_b.h 中。
  • @Andrey 在文件组织(以及其他所有内容)方面我正在关注 Lippman 的书。我有像上面那样组织的其他代码并且工作正常
  • 正如 Stroustrup 所说,您应该在将模板声明用于翻译单元之前包含模板声明,并单独编译它们的定义。在您的代码模板中是一个单元
  • @Andrey - 你能不能说得更具体些。我跟不上你。对不起,我是初学者。我什至不知道应该是什么翻译单元!如果你能通过参考代码给我一个例子,那就太好了。无论如何,谢谢。
  • Stroustrup,C++ 编程语言,第 9 章“源文件和程序”和第 13.7 章“模板。源代码组织”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 1970-01-01
  • 2013-07-30
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多