.hpp 和 .cpp 中的 C++ 模板 class 运算符没有匹配函数
No matching function for template class operator in C++ with .hpp and .cpp
我有两个文件要编译。它们如下:
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);
我完全不清楚为什么调用操作员会引发错误。为函数 "print" 实例化的两种输入类型明确定义了运算符。
是不是因为编译器先在头文件中查找,找不到指定类型的运算符实例。
在头文件中定义运算符也没有多大用处。这(据我所知)再次会引发错误,因为在头文件中实现了两个具有相同名称但不同 return 类型的函数(运算符)。
怎么办?
你的函数
void Array<T>::print(const Array<U>& inputArray)
接受 const 引用,而它正在调用的方法:
T* operator()(int x, int y);
不是 const,因此出现错误。
第一个问题是 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>& inputArray
是。 inputArray
只能调用 const
方法。
您的代码还有许多其他问题,但其中任何一个都可能导致您出现错误消息。
我有两个文件要编译。它们如下:
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);
我完全不清楚为什么调用操作员会引发错误。为函数 "print" 实例化的两种输入类型明确定义了运算符。 是不是因为编译器先在头文件中查找,找不到指定类型的运算符实例。 在头文件中定义运算符也没有多大用处。这(据我所知)再次会引发错误,因为在头文件中实现了两个具有相同名称但不同 return 类型的函数(运算符)。
怎么办?
你的函数
void Array<T>::print(const Array<U>& inputArray)
接受 const 引用,而它正在调用的方法:
T* operator()(int x, int y);
不是 const,因此出现错误。
第一个问题是 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>& inputArray
是。 inputArray
只能调用 const
方法。
您的代码还有许多其他问题,但其中任何一个都可能导致您出现错误消息。