gpt4 book ai didi

java - 将 Java 转换为 C++ : Templates vs. 泛型

转载 作者:搜寻专家 更新时间:2023-10-31 02:16:23 27 4
gpt4 key购买 nike

我是一个 C++ 新手,正在尝试将 Java 代码转换为 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;

关于java - 将 Java 转换为 C++ : Templates vs. 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37017078/

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