如何编译模板c++11,我可以c++14

how I can compile templates c ++ 11, I can c ++ 14

本文关键字:c++11 我可以 c++14 何编译 编译      更新时间:2023-10-16

1

在c++14中,运行良好

//ar.h

#ifndef AR_H
#define AR_H
template<class T>
class ar {
 public:
  ar();
  ~ar();
  int insertD(T value);
 private:
 protected:
};
#endif //AR_H

//ar.cpp

#include "ar.h"

template<class T>
int ar<T>::insertD(T value){
  int testInsert = -1;
  //..
  //..
  return testInsert;
}

//main.cpp

#include "ar.h"
#include "ar.cpp"                  
int main(int argc, char **argv){
 arr<int> arrD;
 arrD.insertD(1);//test

 return 0;
}

这是在C++14中做到这一点的正确方法,只包括,只在main.cpp中包含ar.cpp?

更新

过了很长时间。。。我决定更改我的GNU并在另一个操作系统中进行测试,令我惊讶的是,示例1和示例3都是相同的,它们在C++14和C++11中都能很好地工作,也许这是我的编译器中的一个错误。

https://gcc.gnu.org/onlinedocs/gcc-3.0/gcc_3.html

-pedantic有效的ISO C和ISO C++程序应该在有或没有这个选项的情况下正确编译(尽管很少有程序需要-ansi或指定所需ISO C版本的-std选项)。然而如果没有这个选项,某些GNU扩展和传统的C和C++功能也得到支持。有了这个选项,他们就会被拒绝。

-学究式的:与-ansi结合使用,这告诉编译器严格遵守ansi标准,拒绝任何符合不合规。

  • 没有迂腐的c++14效果很好
  • c++14与迂腐的工作很好
  • c++11没有迂腐,不起作用
  • c++11与迂腐的工作很好

从main中删除#include "ar.cpp"。您定义了两次insert

C++11和C++14中的相关规则没有区别。您在测试运行之间做了一些与语言版本无关的不同操作。

我也建议不要称之为.cpp。按照惯例,包含的任何都不应称为.cpp。由于您需要将模板定义放在某个标头中,因此人们通常会将此类标头命名为.hpp或类似.ipp的名称,以使其脱颖而出。但.cpp只是令人困惑;事实上,它似乎直接把你带入了这个问题。

您不应该包括任何.cpp文件,只应该包括.h文件。单独编译所有.cpp文件,只将它们链接在一起。生成文件示例:

CC=g++
ARGS=-Wall -pedantic
OBJFILES=ar.o
all: $(OBJFILES)
       $(CC) $(ARGS) $(OBJFILES) main.cpp -o my.program
ar.o:
       $(CC) $(ARGS) -c ar.cpp