考虑以下模板类:
//Node.hh
template<class dataType>
class impNode
{
private:
dataType _data;
public:
explicit impNode(const dataType &data) { std::cout << "this constructor is called!" << std::endl; };
virtual ~impNode() { };
dataType getData() { }; //This is where the error triggers
};
现在,当实例化这个类时:
//main.cpp
int main(int, char**)
{
impNode a{98};
impNode b{false};
impNode c{"hello"};
}
我得到以下编译时错误:
error: function returning an array
[build] 27 | dataType getData() { };
避免这种情况的一种方法是专门化类模板:
template<>
class impNode<char[6]>
{
private:
public:
explicit impNode(const char data[6]) { std::cout << "This class template specialization is needed for the program to compile" << std::endl; };
virtual ~impNode() { };
char* getData() { };
};
这样做,程序编译并成功运行,作为程序的输出:
this constructor is called!
this constructor is called!
This class template specialization is needed for the program to compile
然而,我希望能够实例化类与任何cstyle右值字符串,而不必专门为每个不同的大小。
直接使用auto:
auto getNode() { return _data; }
您可以提供模板演绎指南:
template<std::size_t N> impNode(char const (&)[N]) -> impNode<char const*>;
演示或者如果您需要匹配任何类型而不仅仅是char
:
template<typename T, std::size_t N> impNode(T const (&)[N]) -> impNode<T const*>;
然而,让getData
返回一个引用可能更容易:
dataType& getData() { };