好吧,我一直在苦苦掙扎,因爲昨天這個奇怪的錯誤,所以我想是時候讓社區...(Objective-)C++複製模板專業化符號
我目前的工作目標-C++,我有在頭文件這樣的純粹的C++類的聲明:
#ifndef __MATRIX_H__
#define __MATRIX_H__
#define USE_NEON_UPSAMPLING2X true
#define USE_NEON_THRESHOLD true
typedef float OCRfloat;
template<class T = OCRfloat>
class Matrix {
public:
...
Matrix threshold(T thresholdValue) const;
...
Matrix upsample2x() const;
...
};
#ifdef TARGET_OS_IPHONE
#if USE_NEON_UPSAMPLING2X
template<> Matrix<float> Matrix<float>::upsample2x() const;
#endif
#if USE_NEON_THRESHOLD
template<> Matrix<float> Matrix<float>::threshold(float thresholdValue) const;
#endif
#endif
#include "Matrix.cpp"
#endif
它的模板類,具有基本矩陣運算,但是,我要優化上T =浮子通過模板特一些瓶頸。我有包括Matrix.cpp文件,如下所示:
#include <iostream>
#include <cmath>
#if defined TARGET_OS_IPHONE
#include <Accelerate/Accelerate.h>
#endif
...
template<class T> Matrix<T> Matrix<T>::threshold(T thresholdValue) const {
... // general naive algorithm
}
template<class T> Matrix<T> Matrix<T>::upsample2x() const{
... // general naive algorithm
}
#ifdef TARGET_OS_IPHONE
#if USE_NEON_UPSAMPLING2X
template<> Matrix<float> Matrix<float>::upsample2x() const{
... // specialized for ARM NEON float32_t
}
#endif
#if USE_NEON_THRESHOLD
template<> Matrix<float> Matrix<float>::threshold(float thresholdValue)const{
... // specialized for ARM NEON float32_t
}
#endif
的問題如下: 如果我定義USE_NEON_UPSAMPLING2X =虛假和USE_NEON_THRESHOLD =真,一切工作正常 - 應用程序是建立和工作方式類似魅力。但是,如果我設置USE_NEON_UPSAMPLING2X = true,則連接斷開與以下內容:
duplicate symbol __ZNK6MatrixIfE10upsample2xEv in:
/.../OCRDemo-eggnlcolcwqycjagwvwddpfwgzlb/Build/Intermediates/OCRDemo.build/Release-iphoneos/OCRDemo.build/Objects-normal/armv7/A.o
/.../OCRDemo-eggnlcolcwqycjagwvwddpfwgzlb/Build/Intermediates/OCRDemo.build/Release-iphoneos/OCRDemo.build/Objects-normal/armv7/B.o
duplicate symbol __ZNK6MatrixIfE10upsample2xEv in:
/.../OCRDemo-eggnlcolcwqycjagwvwddpfwgzlb/Build/Intermediates/OCRDemo.build/Release-iphoneos/OCRDemo.build/Objects-normal/armv7/A.o
/.../OCRDemo-eggnlcolcwqycjagwvwddpfwgzlb/Build/Intermediates/OCRDemo.build/Release-iphoneos/OCRDemo.build/Objects-normal/armv7/C.o
duplicate symbol __ZNK6MatrixIfE10upsample2xEv in:
/.../OCRDemo-eggnlcolcwqycjagwvwddpfwgzlb/Build/Intermediates/OCRDemo.build/Release-iphoneos/OCRDemo.build/Objects-normal/armv7/A.o
/.../OCRDemo-eggnlcolcwqycjagwvwddpfwgzlb/Build/Intermediates/OCRDemo.build/Release-iphoneos/OCRDemo.build/Objects-normal/armv7/D.o
有趣的是,這兩種方法都在這些文件中使用,但是連接器只抱怨upsample2x ......之間的唯一區別從語法的角度來看,這兩個參數的數量是:閾值有一個參數T,而upsample2x不需要 - 除此之外,兩者都被定義爲const,都返回矩陣等。
所以我的問題是:什麼導致這個神祕的錯誤,我該如何解決它?
不要在.cpp中定義模板成員,它會對你沒有好處。 –
.cpp文件僅用於從頭文件中分離實現,避免單片1000行頭文件。否則,頭文件中會包含.cpp,因此編譯器應該在其中粘貼內容。 無論如何,我用.cpp的內容替換了include指令,但結果保持不變。 (我知道你不能像正常的C++類那樣分離模板聲明和實現,但這裏不是這種情況。) –