将Java转换为C++:模板与泛型
Converting Java to C++: Templates vs. Generics
我是一个试图将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;
相关文章:
- 错误处理.将系统错误代码映射到泛型
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 链表的泛型函数remove()与成员函数remove)
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 模板化接口 - 创建一个泛型模板类以返回任何容器
- 如何编写将要继承的泛型代码?
- C++17 如何保存泛型可调用对象以供以后使用
- 使用宏扩展的泛型:为什么指令缓存使用不当?
- C++泛型类错误,问题出在哪里?
- C++泛型类,单独实现?
- 将参数传递给泛型 lambda 时复制构造函数不正确
- 泛型枚举和其他类型的重载模板函数
- 使用泛型类型推送到堆栈时出现问题
- 可变参数泛型 lambda 和函数重载
- C++ 泛型和多态性:这种模式可行吗?
- 这些语句是否等效(静态变量、常量变量和泛型)
- Java 是否像C++模板一样具有泛型推论?
- 为堆栈实现泛型集合
- 以特征类型作为参数的泛型函数回调
- 如何在容器中指定模板化别名的泛型类型