我有一個宣告方法的頭檔案和一個帶有實作的代碼檔案。在編譯時,編譯器會出現“未定義的對...的參考”錯誤。如果我將該方法的實作復制到標頭,它會告訴我該方法正在代碼檔案中重新定義。當然如果它可以在cpp檔案中找到呼叫副本的方法,那么它可以使用它。由于找不到,將其添加到標頭不應導致重新定義。
所有標題都受到保護。在下面的代碼中,如果我取消對標頭實作的注釋,則重新定義該方法,如果我保留它的注釋,則該方法未定義。如果我只使用標頭實作,一切都編譯得很好,但架構不好。cpp 檔案被正確復制到輸出檔案夾。示例代碼:
- 測驗.ino
- 數學.h
- 數學.cpp
測驗.ino
#include "math.h"
void setup() {
int result = Math::Double((int)2);
}
void loop() {}
數學.h
#ifndef MATH_H
#define MATH_H
namespace Math {
template <typename U>
U Double(U value);
// template <typename U>
// U Interpolate(U value) {
// return value * 2; ?
// ?}
}
#endif
數學.cpp
#include "math.h"
template <typename U>
U Math::Double(U value) {
return value * 2; ?
}
uj5u.com熱心網友回復:
您的代碼中有一些 C 語法錯誤。
- 模板必須在頭檔案中宣告和定義(很少有語法對此提供例外,但我不會在這里討論)。
- 您在“回圈”函式定義之前缺少括號。
- 您正在使用名稱“value”宣告您的 Double 引數,但隨后嘗試使用名稱“result”來使用它
這是更正后的代碼:
編輯將此更改為單獨的模板宣告/定義。原始答案將在此修訂答案之后的星號行下方。
數學.h
#ifndef MATH_H
#define MATH_H
namespace Math {
template <typename U>
U Double(U value);
}
#include "math_ipp.h"
#endif
math_ipp.h
#ifndef MATHIPP_H
#define MATHIPP_H
#include "math.h"
namespace Math {
template <typename U>
U Double(U value) {
return value * 2;
}
}
#endif
測驗.ino
#include "math.h"
void setup() {
int result = Math::Double((int)2);
}
void loop() {}
********** math.h 下方的原始答案
#ifndef MATH_H
#define MATH_H
namespace Math {
template <typename U>
U Double(U value) {
return value * 2;
}
}
#endif
測驗.ino
#include "math.h"
void setup() {
int result = Math::Double((int)2);
}
void loop() {}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/430113.html
下一篇:這個頭檔案在C 中是什么意思?
