2017-09-17 13 views
0

私は比較的小さなC++プロジェクトを持っており、小さなヘルパー関数などを含むUtilsヘッダーファイルを作ることにしました。テンプレートを使用している関数を宣言していたとき、私はテンプレートを必要としない関数を作成しようとしましたが、うまくいけません。テンプレートなしでC++関数を宣言することはできません

結果は、リンカエラーです。既に定義されています。(ファイル).obj

私は単純なvoid関数を宣言することすらできません。テンプレートを持たないものはリンカーエラーです。

私には、これを引き起こす可能性のあるものは何もありません。ここでは、ヘッダファイルのコードです...事前に感謝します。

#pragma once 

namespace Utils 
{ 
    std::string GetActiveWindowTitle() 
    { 
     // This doesnt work either, also gives linker error. 
     return active_window; 
    } 

    template<typename T> 
    void Print(char * value, T printValue) 
    { 
     std::cout << value << ": " << printValue << std::endl; 
    } 

    template<typename T> 
    void Print(T printValue) 
    { 
     std::cout << "DEBUG: " << printValue << std::endl; 
    } 

    void PrintStr(std::string str) 
    { 
     // This doesn't work because it doesnt have the template, it gives a linker error 
     std::cout << "DEBUG: " << str.c_str() << std::endl; 
    } 
} 
+8

は 'あなたのヘッダー内の関数定義にinline'を追加、または他の別々の翻訳単位(.cppファイル)に関数定義を移動するを参照してください。 。 * function-templates *の 'inline'指定子は不要です。 – WhiZTiM

+7

ヒント:テンプレートは暗黙のうちに' inline'です。 – Rakete1111

答えて

2

機能テンプレートが暗黙のうちにinlineある参照してください。したがって、がヘッダファイル内にと定義されている場合、ODR (One Definition Rule)に違反しません。ヘッダーファイル内の非テンプレート関数の場合は、inlineとして定義するか、別の翻訳単位で定義する必要があります。

だから、あなたが行うことができます:

#pragma once 

namespace Utils 
{ 
    inline std::string GetActiveWindowTitle() 
    { 
     return active_window; 
    } 

    template<typename T> 
    void Print(char * value, T printValue) 
    { 
     std::cout << value << ": " << printValue << std::endl; 
    } 

    template<typename T> 
    void Print(T printValue) 
    { 
     std::cout << "DEBUG: " << printValue << std::endl; 
    } 

    inline void PrintStr(std::string str) 
    { 
     std::cout << "DEBUG: " << str.c_str() << std::endl; 
    } 
} 

Inline keyword vs header definition

-2

複数のcppにヘッダーを含めると、関数が複数回定義され、リンカーが上記のエラーを表示します。 What is the difference between a definition and a declaration?またはWhat are forward declarations in C++?

+1

今、この回答は低品質です。あなたは、この質問に答える別の答えがあると信じるならば、重複として質問を掲示します(または評決が十分であるときに投票を終了する)。それが重複しない場合は、あなたの答えの中で問題を解決するために必要なすべての情報を提供してください。今、この答えは、問題を__solve__する方法を教えていません。単に理由を示唆するだけで、読者は他の質問を見てそこに詳細を見つけることができます。 –

関連する問題