2011-06-24 11 views
2

類似のタグをチェックしましたが、私が間違っていることを見つけることができません。 私はCImgライブラリを使用しようとしています。これは初めてC++のテンプレートを使って作業しています。

私はこのライブラリで作業するために画像処理用のものを移植する途中ですが、少し苦労しました。うまくいけば、ここの誰かが私をまっすぐにすることができる!

私はCImgで何ができるのか見るためにメインファイルを持っていますが、今はちょうどサンドボックスとして使っています。私のライブラリ(CN)とCImgライブラリを含むいくつかのテンプレート関数(私の.cppファイルは正しく動作しなかったので)を使ってヘッダファイルを作成しました。作成したテンプレート関数は、CNライブラリも使用しない限り、問題なく動作します。つまり、 cn_cimg_get_RGBtoGray(tinyImg)は意図したとおりに動作します。私は以下
g++ -Icn -Icimg -o cimg.bin main.cpp cn/cn_matrix.cpp cn/cn_image.cpp \ -lpthread -lX11 -lgdi32C++、ネームスペース、テンプレート、およびマッチング関数呼び出しなし

該当するコードがあるとコンパイルすると、GCC
main.cpp:54: error: no matching function for call to 'cn_cimg_get_CNtoCImg(CN::cnImage&)

から次取得しています。それで、私は願っています。

がここにここに私の main.cppに

#include "cn_image.h" 
#include "cn_cimg.hpp" 
#include "CImg.h" 

using namespace cimg_library; 
using namespace CN; 

int main(int argv, char **argc) { 

cout << "MAIN RUNNING" << endl;  
srand(time(NULL)); 

// Create CImg Stuff (New) 
CImg<unsigned char> tinyImg("16x16.gif"); 
CImg<unsigned char> gray = cn_cimg_get_RGBtoGray(tinyImg); 

// Create cnImage (Old) 
cnImage cn; 
cn_create(&cn, tinyImg.width(), tinyImg.height()); 

// Copy tinyImg to cn manually 
cimg_forXY(tinyImg, x, y){ 
    cn.r.data[x][y] = tinyImg(x, y, CHANNEL_R); 
    cn.g.data[x][y] = tinyImg(x, y, CHANNEL_G); 
    cn.b.data[x][y] = tinyImg(x, y, CHANNEL_B); 
} 

// Create new CImg and try conversion function 
CImg<unsigned char> fromCN = cn_cimg_get_CNtoCImg(cn); 

// Check if fromCN is tinyImg 
fromCN.display(); 

// Clean up cnImage Memory 
cn_destroy(&cn); 
return 0; 
} 

cn_cimg.hpp

#include "cn_image.h" 
#include "CImg.h" 
using namespace cimg_library; 

namespace CN { 

static const int CHANNEL_R = 0; 
static const int CHANNEL_G = 1; 
static const int CHANNEL_B = 2; 

// Converts RGB to GrayScale and Returns a new CImg 
template <class CImg> 
CImg cn_cimg_get_RGBtoGray(const CImg& img) 
{ 
    // Create Single Channel (Gray) Image 
    CImg temp(img.width(), img.height(), 1); 

    cimg_forXY(img, x, y) 
    { 
     temp(x, y) = (img(x, y, CHANNEL_R) + img(x, y, CHANNEL_G) + img(x, y, CHANNEL_B))/3.0f; 
    } 

    return temp;  
} 

    // cnImage to CImage conversions 
template <class CImg> 
CImg cn_cimg_get_CNtoCImg(const cnImage &cn) 
{ 
    // Confirm cnImage has stuff 
    if(!cn_isAlloc(&cn)) 
    { 
     // If not, return basic CImg 
     CImg cimg(1,1,1,3); 
     return cimg; 
    } 

    // Create a CImg with 3 Channels (RGB) 
    CImg cimg(cn.rgb.cols, cn.rgb.rows, 1, 3); 

    // Copy the Channels 
    cimg_forXY(cimg, x, y) 
    { 
     cimg(x, y, CHANNEL_R) = cn.r.data[x][y]; 
     cimg(x, y, CHANNEL_G) = cn.g.data[x][y]; 
     cimg(x, y, CHANNEL_B) = cn.b.data[x][y]; 
    } 
    return cimg; 
}  
} 

です私は本当に私は機能と一致しないことができる理由はわかりませんが、私は通常、初めて何かをするときにこれらの問題にぶつかります。また、誰かが私のテンプレートに悪いスタイルやその他のものを見た場合、私は喜んで批判します。みんな、ありがとう。

答えて

3

コンパイラは、戻り値の型からテンプレートパラメータを推測することはできません。あなたは、この場合には、明示的供給にテンプレートパラメータを持つ:

CImg<unsigned char> fromCN = cn_cimg_get_CNtoCImg<CImg<unsigned char> >(cn); 
+0

完璧!ありがとう。これはCImgが入力されていないので返されるジェネリックのタイプを知る方法がないためですか? – Sapiens

+0

正確です。あなたは、あなたのcnImageを任意のタイプのCImgに変換する自由を持っています。コンパイラはどちらがどれかを知らない。 –

1

は、テンプレートをインスタンス化明示的に試してみてください:

CImg<unsigned char> fromCN = cn_cimg_get_CNtoCImg< CImg<unsigned char> >(cn); 

EDIT:なんてこった! 13秒で殴られる。

+0

それでも私はまだあなたに感謝します。私はこれにつまずいてどれくらいの時間がかかるのか分からない。 – Sapiens

+0

どのように?それはレースではなかった – sehe

+0

昨日の200リミットを打ったのは1人だけだったので、サインオフする前にそれを手に入れようと思っていた。 :) – Mikola

0

コンパイラは、戻り値からそれを推測することはできませんので、あなたはテンプレートの値を指定する必要があります。定義され

方法:

template <class CImg> 
CImg cn_cimg_get_CNtoCImg(const cnImage &cn) 

を呼び出す必要があります:

CImg<unsigned char> fromCN = cn_cimg_get_CNtoCImg(CImg<unsigned char>)(cn); 

それは紛らわしいですテンプレートパラメータはCImgと呼ばれているため、たとえば名前をTに変更すると、その違いを確認するだけです。

template <class T> 
T cn_cimg_get_CNtoCImg(const cnImage &cn); 
関連する問題