我收到许多未解决的符号错误,我无法弄清楚原因。
此问题的最常见来源似乎是拼写错误的方法名称,忘记使用作用域操作符指示方法属于哪个类,并且忘记在项目中包含.cpp
文件。
我已经检查了所有这些问题,但似乎没有一个适用。我告诉它方法属于哪个类(通过Point<T>:: ...
),我仔细检查了方法名称,它们都是正确的,.cpp
文件显示在解决方案资源管理器中(我甚至尝试将其删除并重新添加)。
我有一段时间没有写过C ++,所以我可能会忽略一些东西,但我看不出来。
(在发布之后,我意识到我的操作员被滑倒了。虽然这不应该影响我的错误,所以请暂时忽略。)
具体来说,这些是我得到的错误:
1>Main.obj : error LNK2019: unresolved external symbol "public: __thiscall Point<int>::Point<int>(int,int)" (??0?$Point@H@@QAE@HH@Z) referenced in function _main
1>Main.obj : error LNK2019: unresolved external symbol "public: class Point<int> __thiscall Point<int>::operator+(class Point<int>)const " (??H?$Point@H@@QBE?AV0@V0@@Z) referenced in function _main
1>Main.obj : error LNK2019: unresolved external symbol "public: class Point<int> __thiscall Point<int>::operator-(class Point<int>)const " (??G?$Point@H@@QBE?AV0@V0@@Z) referenced in function _main
1>Main.obj : error LNK2019: unresolved external symbol "public: class Point<int> __thiscall Point<int>::operator*(class Point<int>)const " (??D?$Point@H@@QBE?AV0@V0@@Z) referenced in function _main
1>Main.obj : error LNK2019: unresolved external symbol "public: class Point<int> __thiscall Point<int>::operator/(class Point<int>)const " (??K?$Point@H@@QBE?AV0@V0@@Z) referenced in function _main
1>Main.obj : error LNK2019: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Point<int>)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@V?$Point@H@@@Z) referenced in function _main
这些是有问题的文件:
Point.h
#ifndef POINT_H
#define POINT_H
#include <iostream>
template <typename T>
class Point {
const T x;
const T y;
public:
Point(T x, T y);
Point<T> moveBy(T xOff, T yOff) const;
Point<T> operator+(const Point<T> otherPoint) const;
Point<T> operator-(const Point<T> otherPoint) const;
Point<T> operator*(const Point<T> otherPoint) const;
Point<T> operator/(const Point<T> otherPoint) const;
friend std::ostream& operator<<(std::ostream& os, const Point<T> p);
private:
Point<T> applyOperator(T(*f)(T, T), const Point<T> otherPoint) const;
};
template <typename T>
std::ostream& operator<<(std::ostream& os, const Point<T> p) {
return os << "(" << p.x << "," << p.y << ")";
}
#endif
Point.cpp:
#include "Point.h"
template <typename T>
Point<T>::Point(T x, T y) :
x(x),
y(y) {
}
template <typename T>
Point<T> Point<T>::moveBy(T xOff, T yOff) const {
return this + Point(xOff, yOff);
}
template <typename T>
Point<T> Point<T>::operator+(const Point<T> otherPoint) const {
return applyOperator([](x, y) {x + y});
}
template <typename T>
Point<T> Point<T>::operator-(const Point<T> otherPoint) const {
return applyOperator([](x, y) {x - y});
}
template <typename T>
Point<T> Point<T>::operator*(const Point<T> otherPoint) const {
return applyOperator([](x, y) {x * y});
}
template <typename T>
Point<T> Point<T>::operator/(const Point<T> otherPoint) const {
return applyOperator([](x, y) {x / y});
}
template <typename T>
Point<T> Point<T>::applyOperator(T(*f)(T, T), const Point<T> otherPoint) const {
return Point(f(this.x, otherPoint.x), f(this.y, otherPoint.y));
}
Main.cpp:
#include <iostream>
#include "Point.h"
int main(int argc, char* argv[]) {
Point<int> p1(1, 2);
Point<int> p2(2, 3);
std::cout << p1 << std::endl;
std::cout << p2 << std::endl;
Point<int> p3 = p1 + p2;
Point<int> p4 = p1 - p2;
Point<int> p5 = p1 * p2;
Point<int> p6 = p1 / p2;
std::cout << p3 << std::endl;
std::cout << p4 << std::endl;
std::cout << p5 << std::endl;
std::cout << p6 << std::endl;
}
答案 0 :(得分:1)
问题是类模板成员函数定义在Point.cpp
中,但是在编译此文件时,编译器不知道需要为T
= {{1实例化模板}}。事实上,我认为int
基本上是空的。
编译器愉快地编译Point.obj
并调用Main.cpp
的成员 - 期望在链接时提供它们 - 但链接器然后抱怨,因为它无法找到在任何地方定义的成员。
解决方案是(a)将Point的成员函数定义移动到Point<int>
,或者(b)通过明确声明该特化来强制Point.hpp
Point<int>
的实例化:只需添加Point.cpp
末尾的template class Point<int>;
行。