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

时间:2015-11-21 11:59:39

标签: c++ c++11 c++14

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或   -std选项,指定所需的ISO C版本)。然而,   没有这个选项,某些GNU扩展和传统的C和C ++   功能也受支持。使用此选项,它们将被拒绝。

     

-pedantic:与-ansi一起使用,这告诉编译器严格遵守ANSI标准,拒绝任何代码   不合规。

  • c ++ 14没有迂腐的作品
  • c ++ 14 with pedantic运作良好
  • c ++ 11没有迂腐,不起作用
  • c ++ 11,迂腐有效

2 个答案:

答案 0 :(得分:3)

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

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

我还建议不要将其称为.cpp。通常,您包含的 nothing 应该被称为.cpp。由于您需要将模板定义放在某个标题的某个位置,因此人们通常会将此类标题命名为.hpp或类似.ipp,以使其脱颖而出。但.cpp只是令人困惑 - 事实上,它似乎已经引导你直接解决这个问题。

答案 1 :(得分:-2)

您不应包含任何.cpp文件,只包含.h文件。 单独编译所有.cpp文件并仅将它们链接在一起。 示例makefile:

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