2015-10-29 35 views
10

我很抱歉,但我不明白爲什麼以下將無法正常工作(GCC 4.8.1):以一流的使用=類模板initialisers

#include <string> 

using namespace std; 

template <typename T> struct A{ 
    //A(): s("why") { } //fine 
    //string s{"what"}; //also fine 
    //A() = default; //(same error as below) 
    string s = "why?!"; //error: conversion from 'const char [6]' to non-scalar type 'std::string {aka std::basic_string<char>}' requested| 
}; 

struct B{ 
    string s = "why?!"; //all good 
}; 

int main(){ 
    A<int> a; 
    B b; 
} 

出於某種原因,通過引入一個模板,我不能使用=作爲字符串s的類內初始化程序。內置類型的工作,事實上,我可以通過在默認構造函數中使用大括號或顯式初始化來規避它。爲什麼它會使用=大驚小怪?

+5

這可能是一個錯誤。它編譯[gcc 4.9.2](http://goo.gl/Ht3lbI) – NathanOliver

+4

我也重現了這一點(gcc 4.8上的問題),它在gcc 4.9.2上很好。 gcc 4.8有很好的C++ 11支持,但是有一些已知的bug,這可能就是其中之一。我認爲你應該簡單地升級編譯器。 –

+0

MSVC2013編譯。 – marom

回答

4

我沒有看到任何理由不應該這樣做,最近的gcc和clang版本都沒有問題編譯你的代碼。

這看起來涉及到以下gcc的錯誤:Brace-initializing a vector with a direct-initialization NSDMI doesn't work in a template在類的初始化工作的非模板的情況下,但不是爲模板的情況:

​​

此錯誤報告:non-empty braced-init-list of non-static data member T[N] in class template results in error diagnostic, if T is a class是有點更密切的以下測試用例以相同的方式失敗:

struct A { }; 

template<class> 
struct B { 
    A a[1] = { A() }; 
}; 

int main() { B<void> b; } 
+0

足夠接近。我把我的編譯器升級太久了。非常感謝。 – AntiElephant

相關問題