模板化构造函数在结构中不可访问

Kyl*_*yle 3 c++ templates constructor iostream c++17

模板化构造函数在 struct 中不可访问。如果可能的话,我仍然希望允许非模板化构造。如果不可能的话,我想了解这堵墙在语言中实际上是什么,如果有的话。

错误是这样的: 函数式转换或类型构造需要“(”

这是一个语法错误。使用模板构建的方式是 name(args),这正是:

A a = A<short>(1);...正在做,对吗?

#include <iostream>

struct A {
    int i;
    A() : i(0) { }
    
    template <typename T>
    A(T i) : i(int(i)) { }

    void print() {
         std::cout << i << std::endl;
    }
};

int main() {
    A a = A<short>(1);
    a.print();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

- 编辑 -

添加我最初遇到的第一个问题。答案很快就出来了,但这里还有一些细微差别。让我更好地描述它。

struct A {
    std::function<int(int)> fn;

    template <typename T>
    A() {
        fn = [](int i) {
            /// merely using T somewhere in this lambda
            return int(T(i));
        };
    }
};

int main(int c, const char *v[]) {
    A a = A<int>();
}
Run Code Online (Sandbox Code Playgroud)

我最初声明它必须有默认构造函数,但我实际上并不需要这样。然而,我没有在任何参数中直接引用模板参数,我知道为什么这一定是我所坚持的?

-- 编辑 3 --

在我的例子中,我只需要一个类模式模板设置。我有点固执的原因是需要在标头中保留一些代码。

P K*_*mer 5

如果您显式地从简短构造 A ,则将选择模板化构造函数

#include <iostream>

struct A 
{
    int i;
    A() : i(0) { }

    // i(int(i)) { } <== do NOT use "C" style casts in C++
    template <typename T>
    A(T v) :
        i{ static_cast<int>(v) } 
    {
        std::cout << "using templated constructor\n";
    }


    void print() {
        std::cout << i << std::endl;
    }
};

int main() 
{
    A a{ short{1} }; // construct a from a short
    a.print();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)