模板类–;找不到符号 我看到了一些,但我不能真正理解我需要做什么来修复我为入门级C++类编写的程序。
我的错误是:模板类–;找不到符号 我看到了一些,但我不能真正理解我需要做什么来修复我为入门级C++类编写的程序。,c++,templates,symbols,C++,Templates,Symbols,我的错误是: Build Final Project of project Final Project with configuration Debug Ld "build/Debug/Final Project" normal x86_64 cd "/Users/nick/Dropbox/|Syncs/Xcode/Final Project" setenv MACOSX_DEPLOYMENT_TARGET 10.6 /Developer/usr/bin/g++-4.2 -arch x86_6
Build Final Project of project Final Project with configuration Debug
Ld "build/Debug/Final Project" normal x86_64
cd "/Users/nick/Dropbox/|Syncs/Xcode/Final Project"
setenv MACOSX_DEPLOYMENT_TARGET 10.6
/Developer/usr/bin/g++-4.2 -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.6.sdk "- L/Users/nick/Dropbox/|Syncs/Xcode/Final Project/build/Debug" "-F/Users/nick/Dropbox/|Syncs/Xcode/Final Project/build/Debug" -filelist "/Users/nick/Dropbox/|Syncs/Xcode/Final Project/build/Final Project.build/Debug/Final Project.build/Objects-normal/x86_64/Final Project.LinkFileList" -mmacosx-version-min=10.6 -o "/Users/nick/Dropbox/|Syncs/Xcode/Final Project/build/Debug/Final Project"
Undefined symbols:
"Vector<double>::Vector()", referenced from:
_main in main.o
"Vector<double>::length()", referenced from:
_main in main.o
"Vector<double>::Vector(double const&, double const&, double const&)", referenced from:
_main in main.o
_main in main.o
"Vector<double>::getx() const", referenced from:
_main in main.o
_main in main.o
"Vector<double>::gety() const", referenced from:
_main in main.o
_main in main.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
使用配置调试构建项目最终项目的最终项目
Ld“构建/调试/最终项目”普通x86_64
cd“/Users/nick/Dropbox/| Syncs/Xcode/Final Project”
setenv MACOSX_部署_目标10.6
/Developer/usr/bin/g++-4.2-arch x86_64-isysroot/Developer/SDKs/MacOSX10.6.sdk“-L/Users/nick/Dropbox/| Syncs/Xcode/Final Project/build/Debug”“-F/Users/nick/Dropbox/| Syncs/Xcode/Final Project/build/Debug”-文件列表“/Users/nick/Dropbox/| Syncs/Xcode/Final Project/build/Debug/Final Project.build/Objects-normal/x86_64/Final Project.LinkFileList”-mmacosx version min=10.6-o”/Users/nick/Dropbox/| Syncs/Xcode/Final Project/build/Debug/Final Project”
未定义的符号:
“Vector::Vector()”,引用自:
_主音中的主音
“Vector::length()”,引用自:
_主音中的主音
“Vector::Vector(双常量&,双常量&,双常量&)”,引用自:
_主音中的主音
_主音中的主音
“Vector::getx()const”,引用自:
_主音中的主音
_主音中的主音
“Vector::gety()const”,引用自:
_主音中的主音
_主音中的主音
ld:找不到符号
collect2:ld返回了1个退出状态
以下是我得到的:
//main.cpp
#include <iostream>
#include "Vector.h"
int main () {
Vector<double> a(1, 2, 3);
Vector<double> b(2, 4, 4);
Vector<double> c;
std::cout << "Length: " << b.length() << std::endl;
std::cout << b.getx() << " ," << b.gety() << std::endl;
std::cout << c.getx() << " , " << c.gety() << std::endl;
return 0;
}
//main.cpp
#包括
#包括“Vector.h”
int main(){
向量a(1,2,3);
载体b(2,4,4);
载体c;
标准::cout
是因为我有一个单独的Vector头文件和.cpp文件吗
对
如何让我的主函数识别向量类的函数
将函数模板和类模板成员函数的定义放入头文件中
实际上,模板的定义需要在main.cpp中可用,以便它使用您使用的参数实例化模板(double
,在本例中)。详细说明可从
[35.12]为什么我不能将templates类的定义与其声明分开,并将其放入.cpp文件中?
如果您只想知道如何解决这种情况,请阅读下面两个常见问题解答。但要了解事情为何如此,请首先接受以下事实:
模板不是类或函数。模板是编译器用来生成一系列类或函数的“模式”
为了让编译器生成代码,它必须同时看到模板定义(不仅仅是声明)和用于“填充”模板的特定类型/任何内容。例如,如果您试图使用Foo,编译器必须同时看到Foo模板和您试图生成特定Foo的事实
您的编译器在编译另一个.cpp文件时可能不记得一个.cpp文件的详细信息。它可能记得,但大多数不记得。如果您正在阅读此常见问题解答,它几乎肯定不记得。顺便说一句,这称为“独立编译模型”
基于这些事实,下面的示例说明了为什么事情是这样的。假设您有一个定义如下的模板Foo:
template<typename T>
class Foo {
public:
Foo();
void someMethod(T x);
private:
T x;
};
模板
福班{
公众:
Foo();
空隙率法(tx);
私人:
tx;
};
以及成员函数的类似定义:
template<typename T>
Foo<T>::Foo()
{
...
}
template<typename T>
void Foo<T>::someMethod(T x)
{
...
}
模板
Foo::Foo()
{
...
}
模板
voidfoo::someMethod(tx)
{
...
}
现在假设您在文件Bar.cpp中有一些使用Foo的代码:
//Bar.cpp
void blah_blah_blah()
{
...
Foo<int> f;
f.someMethod(5);
...
}
void blah_blah_blah()
{
...
福福;
f、 方法(5);
...
}
显然,某个地方的某个人将不得不对构造函数定义和someMethod()定义使用“模式”,并在T实际为int时实例化它们在文件Foo.cpp中,编译器在编译Foo.cpp时会看到模板代码,在编译Bar.cpp时会看到Foo,但永远不会同时看到模板代码和Foo
专家们注意:我显然在上面做了一些简化。这是故意的,所以请不要大声抱怨。如果您知道.cpp文件和编译单元之间的区别,类模板和模板类之间的区别,以及模板实际上不仅仅是美化的宏这一事实,那么请不要使用com简单地说:这个问题/答案一开始并不是针对你的。我简化了一些事情,让新手“明白”,即使这样做会冒犯一些专家
[35.13]如何使用模板函数避免链接器错误?
告诉C++编译器编译模板函数.CPP文件时要做哪些实例化。
作为一个例子,考虑头文件Fo.h,其中包含以下模板函数声明:
//文件“foo.h”
模板
外部无效foo();
现在假设文件foo.cpp实际定义了该模板函数:
//文件“foo.cpp”
#包括
#包括“foo.h”
模板
void foo()
{
std::cout这里最简单的解决方案是包含.cc/.cpp文件,并让这些文件包含它们的头文件。例如,如果我们有source.cpp
和header.h
,我们希望在main.cc
文件中使用源文件,然后添加\include“header.h”“
到source.cpp
和#将“source.cpp”
包括到您的main.cpp
不确定编译器是否会对此进行优化,但这对我来说很有效。包含cpp而不是标头并不能真正解决问题。它是一个模板,而模板没有cpp。创建一个标头,并将其余部分存储到*.inl而不是*.cpp。在*.h结尾包含inl。
这
template<typename T>
Foo<T>::Foo()
{
...
}
template<typename T>
void Foo<T>::someMethod(T x)
{
...
}
void blah_blah_blah()
{
...
Foo<int> f;
f.someMethod(5);
...
}
template<typename T>
extern void foo();
#include <iostream>
#include "foo.h"
template<typename T>
void foo()
{
std::cout << "Here I am!\n";
}
#include "foo.h"
int main()
{
foo<int>();
...
}
#include <iostream>
#include "foo.h"
template<typename T> void foo()
{
std::cout << "Here I am!\n";
}
template void foo<int>();
#include "foo.cpp"
template void foo<int>();