将Java转换为C++:模板与泛型

Converting Java to C++: Templates vs. Generics

本文关键字:泛型 C++ Java 转换      更新时间:2023-10-16

我是一个试图将Java代码转换为C++的C++新手,我认为我做错了什么。Java代码如下:

class Container<T> {
    public T internal;
    public static Container lastInstance;
    Container(T value){
        internal = value;
        lastInstance = this;
    }
}
class test2 {
    public static void main(String argv[]){
        Container<String> str = new Container<String>("moo");
        Container<Integer> myint = new Container<Integer>(777);
        System.out.println("Last Instance: " + str.lastInstance.internal);
    }
}

到目前为止,我对C++有以下内容:

#include <iostream>
using namespace std;
template <class T> class Container {
public:
  T internal;
  static Container<T> *lastInstance;
  Container(T val){
    internal = val;
    lastInstance = this;
  };
};
int main(){
  Container<int> *myint = new Container<int>(4);
  Container<string> *str = new Container<string>("hello");
  cout << myint->lastInstance->internal << endl;
  cout << str->lastInstance->internal << endl;
  return 0;
}

当我尝试编译时,我得到了一个Undefined symbols for architecture x86_64:错误。我做错了什么?

编辑:关于错误的更多信息。这个错误实际上是一个链接错误。以下是完整信息:

Undefined symbols for architecture x86_64:
"Container<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::lastInstance", referenced from:
  _main in template-d68cfa.o
  Container<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::Container(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in template-d68cfa.o
"Container<int>::lastInstance", referenced from:
  _main in template-d68cfa.o
  Container<int>::Container(int) in template-d68cfa.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

EDIT2:使用g++编译

一个前提:一般来说,比较Java泛型和C++模板就像比较苹果和桔子。它们在语义上完全不同,工作方式也完全不同。

因此,除非你知道它们为什么以及如何不同,否则尝试将它们翻译成另一个不是一个好主意。

关于您的特定问题,它是由您有一个static成员变量这一事实给出的。C++中的static成员变量需要类声明之外的定义,这是因为您必须告诉编译器该静态变量将存储在哪里。

因此,基本上要解决您的问题,您需要添加lastInstance:的定义

template<typename T> Container<T>* Container<T>::lastInstance;