C ++中带有.hpp和.cpp

时间:2017-01-26 14:52:13

标签: c++ templates linker-errors template-classes

我有两个我想编译的文件。它们如下:

Array.hpp

template<class T> class Array 
{
    public:
        Array() {};
        ~Array() {};

        int width_, height_;
        std::vector<T> data_;

        template<typename U>
        void print(const Array<U>& inputArray);

        T* operator()(int x, int y);
}

Array.cpp

template<typename T> template<typename U>
void Array<T>::print(const Array<U>& inputArray)
{
    std::cout << ( *inputArray(0, 0) ) << std::endl; 
// ERROR: No matching function for call to object of type 'const Array<unsigned char>'
} 
template void Array<uint8_t>::print(const Array<uint8_t>& inputArray);
template void Array<uint8_t>::print(const Array<float>& inputArray);


template <typename T>
T* Array<T>::operator()(int x, int y)
{
    return &data_[0] + x + y*width_;
}
template uint8_t* Array<uint8_t>::operator()(int x, int y);
template float* Array<float>::operator()(int x, int y);

我完全不清楚为什么对操作员的调用会引发错误。为两种输入类型清楚地定义了操作符,这两种输入类型都是为函数&#34; print&#34;实例化的。 是因为编译器首先查找头文件而无法找到具有指定类型的运算符的实例。 在头文件中定义运算符也不会有什么好处。这个(据我的知识到达)再次引发错误,因为在头文件中实现了两个具有相同名称但返回类型不同的函数(运算符)。

怎么办?

2 个答案:

答案 0 :(得分:1)

你的功能

void Array<T>::print(const Array<U>& inputArray)

接受const引用,而它正在调用的方法:

T* operator()(int x, int y);

不是const因此错误。

答案 1 :(得分:0)

第一个问题是void print(const Array<U>& inputArray);不是const,而是void Array<T>::print(const Array<U>& inputArray) const。这些功能不同。也许您打算将print设为静态,因为它不使用this

第二个问题是,运营商T* operator()(int x, int y);不是const,而是const Array<U>& inputArrayinputArray只能调用const方法。

您的代码还有许多其他问题,但其中任何一个都可能导致您的错误消息。