c风格字符串右值类型的类模板编译失败,返回数组错误



考虑以下模板类:

//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() { };

相关内容

  • 没有找到相关文章

最新更新