这是一个后续问题:
c++11 专用的“代理构造函数”委托给私有通用引用构造函数?
我想摆脱那里使用的“枚举类虚拟”。
但我无法委托给模板构造函数。
请参阅下面的代码示例。
#include <iostream>
#include <string>
#include <typeinfo>
class MyClass
{
private:
template <class T>
MyClass(T&& data)
: _data(std::forward<T>(data))
{
std::cout << "MyClass universal reference template c'tor" << std::endl;
}
public:
// proxy c'tors delegating to universal reference c'tor
MyClass (std::string const & data)
: MyClass<std::string>(data)
{
std::cout << "MyClass lvalue c'tor" << std::endl;
}
MyClass (std::string && data)
: MyClass<std::string>(std::move(data))
{
std::cout << "MyClass rvalue c'tor" << std::endl;
}
private:
std::string _data;
};
int
main(
int,
char**)
{
{
std::string str("demo");
MyClass myClass(str);
}
{
MyClass myClass("hello, world");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
main2.cpp: In constructor 'MyClass::MyClass(const string&)':
main2.cpp:21:7: error: 'class MyClass MyClass::MyClass' is not a non-static data member of 'MyClass'
: MyClass<std::string>(data)
^
main2.cpp:21:14: error: expected '(' before '<' token
: MyClass<std::string>(data)
^
main2.cpp:21:14: error: expected '{' before '<' token
main2.cpp: In constructor 'MyClass::MyClass(std::__cxx11::string&&)':
main2.cpp:27:7: error: 'class MyClass MyClass::MyClass' is not a non-static data member of 'MyClass'
: MyClass<std::string>(std::move(data))
^
main2.cpp:27:14: error: expected '(' before '<' token
: MyClass<std::string>(std::move(data))
^
main2.cpp:27:14: error: expected '{' before '<' token
main2.cpp: In function 'int main(int, char**)':
main2.cpp:11:5: error: 'MyClass::MyClass(T&&) [with T = std::__cxx11::basic_string<char>&]' is private
MyClass(T&& data)
^
main2.cpp:46:28: error: within this context
MyClass myClass(str);
^
main2.cpp:11:5: error: 'MyClass::MyClass(T&&) [with T = const char (&)[13]]' is private
MyClass(T&& data)
^
main2.cpp:50:39: error: within this context
MyClass myClass("hello, world");
Run Code Online (Sandbox Code Playgroud)
这并不特定于委托构造函数。构造函数(和转换函数)没有名称,因此语言中无法为它们提供显式模板参数。引用 C++14,[temp.mem] 14.5.2/5:
[注意:因为显式模板实参列表跟在函数模板名之后,并且因为转换成员函数模板和构造函数成员函数模板是在不使用函数名的情况下调用的,所以没有办法为这些函数模板提供显式模板实参列表。——尾注]
注释不是规范性的,但本注释只是明确说明了第 14 章中的规则所遵循的内容。