gpt4 book ai didi

c++ - VS 2011模板类

转载 作者:行者123 更新时间:2023-11-28 03:37:19 26 4
gpt4 key购买 nike

我有一个相当标准的情况,我想按以下方式使用模板化类:

  1. 定义一个.h文件
  2. 让它包含.cpp

在我尝试过的所有其他编译器(即 g++ 和 clang/llvm)中,它工作正常。在 visual studio 中,它告诉我文件已经定义。

如果我手动将 .cpp 中的文本剪切并粘贴到 .h 文件中,那么一切都会正常进行。我的印象是这正是 #include 应该做的。

我的直觉是 visual studio 以某种方式不止一次地编译 .cpp 文件(尽管我在 .h 和 .cpp 文件上放置了 #pragma once)。

这是怎么回事,我怎样才能使我的模板类在 VS 中正常运行?

代码如下:
.h:

#pragma once
template <class T>
class myVector
{
private:
void grow();
public:
int size;
int index;
T** words;
void pushBack(T* data);
inline T* operator[](int);
myVector(void);
~myVector(void);
};

#include "myVector.cpp"

.cpp:

#pragma once
#include "stdafx.h"
#include <cstdlib>
#include "myVector.h"
#include <iostream>
using namespace std;

template<class T>
myVector<T>::myVector(void)
{
this->size = 2000;
words = new T*[size];
index=0;
}

template<class T>
void myVector<T>::pushBack(T* input)
{
if(index<size)
{
words[index]=input;
}
else
{
grow();
words[index]=input;
}
index++;
}

template<class T>
T* myVector<T>::operator[](int i)
{
return words[i];
}

template<class T>
void myVector<T>::grow()
{
//cout<<"I grew:"<<endl;
size*=2;
words = (T**)realloc(words,size*sizeof(T*));
}

template<class T>
myVector<T>::~myVector(void)
{
delete[] words;
}

最佳答案

在我看来,您的困惑源于不知道如何 #pragma once和翻译单元工作。

#pragma once ,很像 include guards,防止文件的内容(通常是标题)被多次拉入单个翻译单元。

如果你#include <vector>在多个实现文件中,内容将全部拉入,但每个翻译单元只拉一次。

所以你应该删除 #include "myVector.cpp" ,因为MSVS自动编译实现文件,也是错误的。

请注意,模板定义必须是可见的,因此您需要将它们移动到 .h文件,就像你做的那样,或者使用你当前的方法,重命名 .cpp文件到类似 .impl 的文件甚至 .h并将其包括在内。

关于c++ - VS 2011模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10478003/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com