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标准,拒绝任何代码 不合规。
答案 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