Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
模板类–;找不到符号 我看到了一些,但我不能真正理解我需要做什么来修复我为入门级C++类编写的程序。_C++_Templates_Symbols - Fatal编程技术网

模板类–;找不到符号 我看到了一些,但我不能真正理解我需要做什么来修复我为入门级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>();