2011-03-07 46 views
1

我工作的這個NeuralNet類:「對class :: function ...的未定義引用」 - 我錯誤地鏈接了嗎?

class NeuralNet { 
public: 
    // Public functions 
private: 
    vectors vect; // Point-of-access for functions in class vectors 
    // Private functions 
}; 

而且我用這個非常簡單的makefile:

all: nnet.exe 
nnet.exe: main.o neuralnet.o vectors.o 
    g++ -o nnet.exe main.o vectors.o neuralnet.o 
main.o: main.cpp neuralnet.h 
    g++ -ggdb -c main.cpp 
vectors.o: vectors.cpp vectors.h 
    g++ -ggdb -c vectors.cpp 
neuralnet.o: neuralnet.cpp neuralnet.h vectors.h 
    g++ -ggdb -c neuralnet.cpp 
clean: 
    rm -f *.o nnet.exe 

當++獲取運行建立最終的可執行克,我得到了很多的誤差以下形式:

neuralnet.o: /path/to/neuralnet.cpp: line# : undefined reference to vectors::fn_name(args)

例如,我已經定義了一個函數:

template<typename T> void fill_vec(vector<T>&, int, double);

當我把這個功能我傳遞的參數,第一個參數vector<double>類型聲明的變量,並且鏈接器將報告undefined reference to void vectors::fill_vec<double>(std::vector<double, std::allocator<double> >&, int, double)

NeuralNet執行所有調用的class vectors功能,從被稱爲vect。然而,networknet.cppnetworknet.h包含「vectors.h」包括,所以我假設我以某種方式鏈接不正確。

有沒有人看到任何明顯的東西?

+0

你有vectors.h包含在neuralnet.h中嗎? – Kizaru 2011-03-07 05:22:52

+0

是的,神經網絡頭文件也包含vectors.h文件。編輯問題以反映現在。 – Rob 2011-03-07 05:27:08

+0

這聽起來很愚蠢 - fn_name()(cAsE sEnSiTiVe)正確使用正確嗎?在這個錯誤之後,你沒有收到「候選人是......」的信息或者你有什麼?順便說一句,這不是一個連接問題。 'g ++ -c'參數會取消鏈接直到最後一步。 – RageD 2011-03-07 05:43:27

回答

2

除非你定義fn_name()直列式vectors.h,僅僅包括neuralnet.cppneuralnet.h是不夠的頭。確保你實際上可以將你的手指指向該功能體。你可能打算將它放在vectors.cpp

作爲模板改變了一切。您應該在頭文件中定義模板方法,而不是在.cpp文件中。儘管您可能在源文件中定義了fill_vec<T>,但編譯器實際上並沒有將實例化爲,因爲對於T的任何值,因爲在該翻譯單元中,它不需要任何實例化。您可以手動爲每個需要的值T實例化它,但是隻需在聲明它的同一位置的標題中定義函數就會更容易。這樣,編譯器就可以在需要的地方提供定義。你會得到多個實例(每個使用它的翻譯單元一個),但鏈接器知道如何合併這些實例。請參閱Undefined reference error for template method

+0

出現在錯誤消息中的'fn_name()'的變體都在* vectors.cpp *中定義,這當然也包含vectors.h - 你什麼意思是什麼時候你說我的手指在功能體? – Rob 2011-03-07 05:58:09

+2

我的意思是你應該確保你實際上可以找到鏈接器說缺失的變體。函數的零參數版本是否真的被定義了?它的定義是什麼?我假定鏈接器說的是實話,而且函數沒有真正定義。如果你認爲它是*定義的,證明它。如果你不能指着它說「這是它的定義」,那麼它就沒有定義。還要確保你沒有任何可能導致編譯器跳過該函數的'ifdef'指令。 – 2011-03-07 06:31:44

相關問題