C ++, пространства имен, шаблоны и не соответствующие функции вызова - PullRequest
2 голосов
/ 24 июня 2011

Я проверил похожие теги, но не могу понять, что я делаю неправильно. Я пытаюсь использовать библиотеку CImg, и я впервые работаю с шаблонами в C ++.

Я в процессе переноса некоторых из моих средств обработки изображений для работы с этой библиотекой, и у меня возникли некоторые проблемы. Надеюсь, кто-то здесь может меня поправить!

У меня есть основной файл, где я играю с CImg, чтобы посмотреть, что он может сделать, сейчас я просто использую его как песочницу. Я создал файл заголовка с некоторыми шаблонными функциями (поскольку мои файлы .cpp не работали правильно), который включает мою библиотеку ( CN ) и библиотеку CImg . Созданные мной функции шаблона работают без проблем, если только они не используют библиотеку CN . То есть, cn_cimg_get_RGBtoGray(tinyImg) работает как задумано. Я получаю следующее от gcc
main.cpp:54: error: no matching function for call to 'cn_cimg_get_CNtoCImg(CN::cnImage&)

Когда я скомпилирую с
g++ -Icn -Icimg -o cimg.bin main.cpp cn/cn_matrix.cpp cn/cn_image.cpp \ -lpthread -lX11 -lgdi32

Ниже приведен соответствующий код; или так надеюсь.

Вот мой 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 ]

3 голосов
/ 24 июня 2011

Компилятор не может вывести параметры шаблона исключительно из возвращаемого типа.В этом случае вы явно указываете параметр шаблона:

CImg<unsigned char> fromCN = cn_cimg_get_CNtoCImg<CImg<unsigned char> >(cn);
1 голос
/ 24 июня 2011

Попробуйте явно создать экземпляр шаблона:

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

РЕДАКТИРОВАТЬ: Argh! побежден на 13 секунд.

0 голосов
/ 24 июня 2011

Необходимо указать шаблонное значение, поскольку компилятор не может вывести его из возвращаемого значения:

определенный метод:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...